【问题标题】:How do I convert an ISO 8601 date time String to java.util.LocalDateTime?如何将 ISO 8601 日期时间字符串转换为 java.util.LocalDateTime?
【发布时间】:2017-02-02 21:58:02
【问题描述】:

我正在从 Wikidata 读取数据。它们代表他们的时间点属性,P585 使用 ISO 8601 规范。但是,与+相同的众生。

如果我使用 Joda,那么将 String 转换为 joda dateTime 会非常简单。

new DateTime(dateTime, DateTimeZone.UTC);

但是,当我执行LocalDateTime.parse("+2017-02-26T00:00:00Z") 时,我收到一条错误消息,提示无法解析索引 0 处的字符。在 Java 8 中是否有此原因。Joda 很容易做到,没有任何错误。

我也尝试过LocalDateTime.parse("+2017-02-26T00:00:00Z", DateTimeFormatter.ISO_DATE_TIME),但没有成功。

我们如何绕过加号而不必通过字符串操作将其删除?

【问题讨论】:

  • 你能在解析前剪掉前面的加号吗?尝试解析str.replaceAll("^\\+", "")
  • 这种格式的“+”是什么意思?
  • 加号表示年份。
  • 是的,我可以修剪加号,但不想这样做,因为 joda.time 可以轻松解析它。我希望 java.time 能解决这个问题。

标签: java datetime java-8


【解决方案1】:

Java 的DateTimeFormatter 类可能会有所帮助。以下是一些我认为可以解决您的问题的示例代码(或者至少可以让您思考):

class DateTimeTester {
  ---
  public static void main(String[] args) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("+yyyy-MM-dd'T'HH:mm:ss'Z'")
        .withZone(ZoneId.of("UTC"));
    LocalDateTime date = LocalDateTime.parse("+2017-02-26T01:02:03Z", formatter);
    System.out.println(date);
  }
}

有关传递给DateTimeFormatter.ofPattern() 的格式字符串的详细信息,请参阅javadoc for DateTimeFormatter 中名为格式化和解析的模式 部分。

注意事项:

Wikidata's list of available data types 谈到time 数据类型:

"时间点的显式值,表示为时间戳类似于 ISO 8601,例如 +2013-01-01T00:00:00Z。年份始终签名并填充为 4 到 16 位数字。”。

所以 Wikidata 的 time 数据类型仅类似于 ISO 8601。

如果您的代码需要处理负数年(第 0 年之前),您需要相应地调整我建议的解决方案。

【讨论】:

  • 感谢您的回答。这是有道理的。我希望 baba.time 在没有 DataFormatter 的情况下自动处理这个问题,就像 joda.time 所做的那样。不过感谢您的解释和回答。如何将此标记为正确答案?
  • 我认为你可以用 DateTimeFormatter.ISO_LOCAL_DATE_TIME 替换那些格式字符串
猜你喜欢
  • 2019-02-27
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 2016-12-14
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
相关资源
最近更新 更多