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

不过感觉有点老套。