我有一个由两部分组成的问题,或者可能有两种不同的方法来解决这个问题。我收到一个类似于 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 之外的区域或在字符串末尾传递的任何区域。所以我现在不知道该怎么办。哦,我无法更改收到的字符串的格式。
DateTime dateTime = ISODateTimeFormat.dateTimeNoMillis().withOffsetParsed().parseDateTime("2015-11-17T17:10:24-0800");
这将创建一个具有固定时区偏移量
DateTime
的 -08:00
。
可能需要更多的工作,但您始终可以使用 DateTimeFormatterBuilder 为日期时间创建您自己的自定义显示。这样,如果您愿意,您可以删除时区并在该时区内渲染它或在本地渲染。
java.time
以下为Joda-Time主页上的通知:
请注意,从 Java SE 8 开始,用户被要求迁移到
(JSR-310) - JDK 的核心部分,它将取代它 项目。java.time
2014 年 3 月,Java 8 引入了现代的
java.time
日期时间 API,取代了容易出错的遗留、java.util
日期时间 API。任何新代码都应使用 java.time
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
的其他日期时间类。