Joda ISODateTimeFormat 不在字符串中使用时区

问题描述 投票:0回答:3

我有一个由两部分组成的问题,或者可能有两种不同的方法来解决这个问题。我收到一个类似于 2015-11-17T17:10:24-0800 的 ISO 字符串。最终目标是在某些 Freemarker 生成的 HTML 中将字符串显示为 11/17/15 5:10 PM。我收到的字符串可以位于任何时区,但我总是需要在其本地时区显示该字符串,如上所示。目前,我们的代码只是获取字符串并将其传递到模板中并进行隐藏:

<#assign mydate = obj.mydate?datetime("yyyy-MM-dd'T'HH:mm:ssz")?string.short>

这不再是好事,因为我相信 Freemarker 正在使用系统的本地时区,而现在我们获得了多个时区。我看到freemarker中有一个iso方法。所以我尝试一下

<#assign order_date = order.order_date?iso("yyyy-MM-dd'T'HH:mm:ssz")>

但我不断收到错误:

For "?iso" left-hand operand: Expected a date, but this evaluated to a string

好吧,我需要约会。与 Joda 合作,我尝试通过以下方式创建日期时间对象:

DateTime dateTime = ISODateTimeFormat.dateTimeNoMillis().parseDateTime("2015-11-17T17:10:24-0800");

但这似乎也使用我的本地时区并显示 2015-11-17T20:10:24.000-05:00。我知道我可以用 withZone(...) 做,但我不知道除了 -0800 之外的区域或在字符串末尾传递的任何区域。所以我现在不知道该怎么办。哦,我无法更改收到的字符串的格式。

java jodatime freemarker iso8601
3个回答
5
投票
DateTime dateTime = ISODateTimeFormat.dateTimeNoMillis().withOffsetParsed().parseDateTime("2015-11-17T17:10:24-0800");

这将创建一个具有固定时区偏移量

DateTime
-08:00


0
投票

可能需要更多的工作,但您始终可以使用 DateTimeFormatterBuilder 为日期时间创建您自己的自定义显示。这样,如果您愿意,您可以删除时区并在该时区内渲染它或在本地渲染。


0
投票

java.time

以下为Joda-Time主页上的通知:

请注意,从 Java SE 8 开始,用户被要求迁移到

java.time
(JSR-310) - JDK 的核心部分,它将取代它 项目。

2014 年 3 月,Java 8 引入了现代的

java.time
日期时间 API,取代了容易出错的遗留
java.util
日期时间 API。任何新代码都应使用
java.time
API*

使用现代日期时间 API 的解决方案

字符串 2015-11-17T17:10:24-0800 包含 -08:00

ZoneOffset,而不是时区。因此,它应该被解析为
OffsetDateTime
。如果它包含
ZoneId
例如Pacific/Pitcairn
,一个
ZonedDateTime
就是合适的解析对象。

将其解析为

OffsetDateTime
后,您可以根据需要对其进行格式化。

如果您想将其转换为

OffsetDateTime
和另一个
ZoneOffset
,您可以使用
OffsetDateTime#withOffsetSameInstant

演示:

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter parser = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssZ");
        OffsetDateTime odt = OffsetDateTime.parse("2015-11-17T17:10:24-0800", parser);
        System.out.println(odt);

        // Print it in a custom format
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/uu");
        String odtFormatted = odt.format(formatter);
        System.out.println(odtFormatted);

        // Convert it into an OffsetDateTime with another ZoneOffset
        // A sample ZoneOffset
        ZoneOffset zoneOffset = ZoneOffset.of("-04:00");
        OffsetDateTime odtWithAnotherOffset = odt.withOffsetSameInstant(zoneOffset);
        System.out.println(odtWithAnotherOffset);
    }
}

输出:

2015-11-17T17:10:24-08:00
11/17/15
2015-11-17T21:10:24-04:00

在线演示

Trail:日期时间了解有关现代日期时间 API 的更多信息。


* 如果您收到

java.util.Date
的实例,请使用
java.time.Instant
 将其转换为 
Date#toInstant
,并根据您的要求从中派生
java.time
的其他日期时间类。

© www.soinside.com 2019 - 2024. All rights reserved.