【问题标题】:Convert date time string like Joda DateTime(String) with Java 8使用 Java 8 转换日期时间字符串,如 Joda DateTime(String)
【发布时间】:2017-08-29 18:00:45
【问题描述】:

我有一个 API 可以以三种可能的格式返回 JSON 格式的日期值:

  1. 2017-04-30T00:00+02:00
  2. 2016-12-05T04:00
  3. 2016-12-05

我需要将这三个都转换为java.time.LocalTimeDate。 Joda 在DateTime 对象上有一个很好的构造函数,它将所有三种格式都作为字符串接受并转换它们。 DateTime dt = new DateTime(StringFromAPI); 就够了。

Java 8 中是否有类似的功能(java.time 包)?看来我现在首先必须正则表达式 String 来检查格式,然后创建 LocalDateTimeZonedDateTimeLocalDate 并将后者 2. 转换为 LocalDateTime。对我来说似乎有点麻烦。有什么简单的方法吗?

【问题讨论】:

  • 所以第一种格式的+02:00 应该被忽略?您是在假设第三个时间为 0:00(午夜)吗?
  • @OleV.V.是的,是的。
  • 感谢您的澄清。在那种情况下,我猜对了,并坚持我的答案。

标签: java datetime time jodatime


【解决方案1】:

我提出了两个选项,每个选项都有其优点和缺点。

一,构建自定义DateTimeFormatter 以接受您的三种可能格式:

public static LocalDateTime parse(String dateFromJson) {
    DateTimeFormatter format = new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE)
            .optionalStart()
            .appendLiteral('T')
            .append(DateTimeFormatter.ISO_LOCAL_TIME)
            .optionalStart()
            .appendOffsetId()
            .optionalEnd()
            .optionalEnd()
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .toFormatter();
    return LocalDateTime.parse(dateFromJson, format);
}

一方面,它很干净,另一方面,有人很容易发现它有点棘手。对于您问题中的三个示例字符串,它会产生:

2017-04-30T00:00
2016-12-05T04:00
2016-12-05T00:00

另一种选择,依次尝试三种不同的格式并选择一种可行的:

public static LocalDateTime parse(String dateFromJson) {
    try {
        return LocalDateTime.parse(dateFromJson);
    } catch (DateTimeParseException e) {
        // ignore, try next format
    }
    try {
        return LocalDateTime.parse(dateFromJson, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
    } catch (DateTimeParseException e) {
        // ignore, try next format
    }
    return LocalDate.parse(dateFromJson).atStartOfDay();
}

我不认为这是最漂亮的代码,还是有人认为它比第一个选项更直接?我认为仅依靠内置的 ISO 格式是有好处的。您的三个示例字符串的结果与上述相同。

【讨论】:

  • 请原谅我的好奇心,@BartKooijman,你能用我的答案吗?尽管我付出了努力,但我意识到我没有给你任何像你描述 JodaTime DateTime 构造函数那样简单的东西。我不是要求一个接受刻度线,而是你的一般和诚实的反应/反馈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 2020-07-21
  • 2021-07-06
  • 2013-05-04
  • 2011-02-17
相关资源
最近更新 更多