java.time 中 joda.ISODateTimeFormat 的等价物?
Equivalent of joda.ISODateTimeFormat in java.time?
我有以下 joda 日期解析器:
ISODateTimeFormat.dateTimeParser().withOffsetParsed()
.
我想将其重构为 java.time
api。但是,与上面的解析器完全等价的是什么,尤其是关于偏移量?
我认为没有与此完全相同的东西。但是,您可以使用 DateTimeFormatter class 根据所需模式构建日期。
最佳等效项 应该是包 java.time.format
中的这个常量,它更喜欢根据文档解析的偏移量(就像使用 Joda-withOffsetParsed() 时的行为):
DateTimeFormatter.ISO_OFFSET_DATE_TIME
但是,仍然存在 小差异。小数点分隔符必须是 Java-8 中的一个点(逗号是不能容忍的,尽管有效,甚至在 ISO 文件中推荐)。另外:Java-8 与 Jodas 毫秒精度相比管理纳秒级精度。也许最重要的区别是:如果输入中缺少偏移量,则 Java-8 会抛出异常,但 Joda 不会(并应用默认时区)。
关于类型的选择:由于您使用的是 DateTime
和固定偏移量,因此最好的等价物应该是 Java-8 中的 OffsetDateTime
。迁移示例:
DateTime dt = ISODateTimeFormat.dateTimeParser().withOffsetParsed().parseDateTime(input);
=>
OffsetDateTime odt = OffsetDateTime.parse(input, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
我遇到了同样的问题。鉴于我的限制,我发现最好的是使用两个 DateTimeFormatter
一个用于解析(基于 的建议)和一个用于格式化:
@DataProvider
public static Object[][] dates() {
return new Object[][] {
{ "2021-02-23T01:42:01.000-0000" },
{ "2021-02-23T01:42:01.000+0000" },
{ "2021-02-23T16:00:00.000-0800" },
{ "2021-02-23T05:42:00.000+0530" },
{ "2021-02-23T00:00:00.0Z" }
};
}
@Test(dataProvider = "dates")
public void testFormatter(String date) {
final DateTime jodaTime = ISODateTimeFormat.dateTime().withOffsetParsed().parseDateTime(date);
final DateTimeFormatter dateTimeFormatterForParsing =
new DateTimeFormatterBuilder().parseCaseInsensitive()
.appendPattern("yyyy-MM-dd'T'HH:mm:ss.[SSSX][SX]")
.toFormatter();
final ZonedDateTime jdkTime = ZonedDateTime.parse(date, dateTimeFormatterForParsing);
// see
System.out.println(jodaTime + " vs " + jdkTime.format(dateTimeFormatterForParsing));
final DateTimeFormatter dateTimeFormatterForFormatting =
new DateTimeFormatterBuilder().parseCaseInsensitive()
.appendPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
.toFormatter();
assertThat(jodaTime.toString()).isEqualTo(jdkTime.format(dateTimeFormatterForFormatting));
}
您不能使用相同的格式化程序进行解析和格式化,因为上面用于解析的格式化程序将输出 2021-02-23T16:42:00.000-080-08
for 2021-02-23T16:42:00.000-0800
。
不过感觉有点老套。
我有以下 joda 日期解析器:
ISODateTimeFormat.dateTimeParser().withOffsetParsed()
.
我想将其重构为 java.time
api。但是,与上面的解析器完全等价的是什么,尤其是关于偏移量?
我认为没有与此完全相同的东西。但是,您可以使用 DateTimeFormatter class 根据所需模式构建日期。
最佳等效项 应该是包 java.time.format
中的这个常量,它更喜欢根据文档解析的偏移量(就像使用 Joda-withOffsetParsed() 时的行为):
DateTimeFormatter.ISO_OFFSET_DATE_TIME
但是,仍然存在 小差异。小数点分隔符必须是 Java-8 中的一个点(逗号是不能容忍的,尽管有效,甚至在 ISO 文件中推荐)。另外:Java-8 与 Jodas 毫秒精度相比管理纳秒级精度。也许最重要的区别是:如果输入中缺少偏移量,则 Java-8 会抛出异常,但 Joda 不会(并应用默认时区)。
关于类型的选择:由于您使用的是 DateTime
和固定偏移量,因此最好的等价物应该是 Java-8 中的 OffsetDateTime
。迁移示例:
DateTime dt = ISODateTimeFormat.dateTimeParser().withOffsetParsed().parseDateTime(input);
=>
OffsetDateTime odt = OffsetDateTime.parse(input, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
我遇到了同样的问题。鉴于我的限制,我发现最好的是使用两个 DateTimeFormatter
一个用于解析(基于
@DataProvider
public static Object[][] dates() {
return new Object[][] {
{ "2021-02-23T01:42:01.000-0000" },
{ "2021-02-23T01:42:01.000+0000" },
{ "2021-02-23T16:00:00.000-0800" },
{ "2021-02-23T05:42:00.000+0530" },
{ "2021-02-23T00:00:00.0Z" }
};
}
@Test(dataProvider = "dates")
public void testFormatter(String date) {
final DateTime jodaTime = ISODateTimeFormat.dateTime().withOffsetParsed().parseDateTime(date);
final DateTimeFormatter dateTimeFormatterForParsing =
new DateTimeFormatterBuilder().parseCaseInsensitive()
.appendPattern("yyyy-MM-dd'T'HH:mm:ss.[SSSX][SX]")
.toFormatter();
final ZonedDateTime jdkTime = ZonedDateTime.parse(date, dateTimeFormatterForParsing);
// see
System.out.println(jodaTime + " vs " + jdkTime.format(dateTimeFormatterForParsing));
final DateTimeFormatter dateTimeFormatterForFormatting =
new DateTimeFormatterBuilder().parseCaseInsensitive()
.appendPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
.toFormatter();
assertThat(jodaTime.toString()).isEqualTo(jdkTime.format(dateTimeFormatterForFormatting));
}
您不能使用相同的格式化程序进行解析和格式化,因为上面用于解析的格式化程序将输出 2021-02-23T16:42:00.000-080-08
for 2021-02-23T16:42:00.000-0800
。
不过感觉有点老套。