如何将ISO 8601日期时间字符串转换为java.util.LocalDateTime?

时间:2017-02-02 01:47:40

标签: java datetime java-8

我正在阅读维基数据中的数据。它们代表了他们的时间属性,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),但徒劳无功。

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

1 个答案:

答案 0 :(得分:5)

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中名为 格式设置和分析的模式 的部分。< / p>

需要注意的事项:

Wikidata's list of available data types说明了time数据类型:

&#34;时间点的显式值,表示为时间戳 类似于 ISO 8601,例如+ 2013-01-01T00:00:00Z。 年份总是签名并填充为4到16位。&#34;。

因此,维基数据的time数据类型仅类似于 ISO 8601.

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