如何使用DateTimeFormatter实现一致性

3

在使用相同的DateTimeFormatter时,我发现类似的输入之间存在不一致性。我需要将其与另一个日期时间输入源进行比较。

例如,给定以下输入:

2020-06-29T01:00:00+01:00 -> my date time formatter -> 2020-06-29T01:00:00+01:00
2021-08-18T21:00:00+0000 -> my date time formatter -> 2021-08-18T21:00:00Z

我希望输出始终为YYYY-mm-ddT00:00:00Z格式,因此第二个输入将得到我想要的结果。
我目前的格式化方式:
DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder()
            .appendValue(ChronoField.YEAR, 4)
            .optionalStart()
            .appendLiteral("-")
            .optionalEnd()
            .appendValue(ChronoField.MONTH_OF_YEAR, 2)
            .optionalStart()
            .appendLiteral("-")
            .optionalEnd()
            .appendValue(ChronoField.DAY_OF_MONTH, 2)
            .appendLiteral('T')
            .appendPattern("HH':'mm':'ss[XXX][X]")
            .toFormatter();

public OffsetDateTime convert(String dateTime) {
  return OffsetDateTime.parse(dateTime, FORMATTER);
}

public String getDateTimeString(OffsetDateTime offsetDateTime) {
  return offsetDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}

public void doStuff(String input) {
  OffsetDateTime odt = convert(input);
  String finalResult = getDateTimeString(odt);
}

..

doStuff(input);

我已经花了几个小时来研究这个,但是对我来说文档不够清晰,我一直遇到各种问题。有什么提示吗?

2个回答

4

OffsetDateTime 转换为 Instant 以去除时区。

public String getDateTimeString(Instant instant) {
  return instant.toString();
}

public void doStuff(String input) {
    OffsetDateTime odt = convert(input);
    String finalResult = getDateTimeString(odt.toInstant());
    System.out.println(finalResult);
}

0
这基本上是与(正确地)被接受的答案相同的方法,只是另一种编写方式:
public static String convertToUtcIso(String datetime) {
    // parse the given String,and format as ISO OFFSET DATE TIME
    return OffsetDateTime.parse(datetime, FORMATTER)
                         // convert the resulting OffsetDateTime to UTC
                         .withOffsetSameInstant(ZoneOffset.UTC)
                         // and format it according to ISO standard
                         .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}

由于更清楚地指出一天中的时间将被调整为偏移量为0小时,可读性上存在细微差异。

与接受的答案类似,示例日期时间"2020-06-29T01:00:00+01:00"将被转换为"2020-06-29T00:00:00Z"(01:00 AM ⇒ 00:00 AM)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接