【问题标题】:How to get consistency using DateTimeFormatter如何使用 DateTimeFormatter 获得一致性
【发布时间】:2021-08-26 05:01:39
【问题描述】:

在使用相同的 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);

我已经浏览了几个小时,但文档对我来说不是那么清楚,而且我遇到了各种各样的麻烦。有什么建议吗?

【问题讨论】:

    标签: java datetimeformatter


    【解决方案1】:

    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);
    }
    

    【讨论】:

      【解决方案2】:

      这与(正确)接受的答案中的方法基本相同,只是另一种编写方式:

      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)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-04
        • 2018-01-26
        相关资源
        最近更新 更多