首页 > 解决方案 > 日期格式将 2019-08-07T20:11:59.6250889+09:30 解析为 UTC Java LocalDateTime

问题描述

我尝试将日期字符串 2019-08-07T20:11:59.6250889+09:30 转换为 LocalDateTime 格式 yyyy-MM-dd HH:mm:ss 格式

String date = "2019-08-07T20:11:59.6250889+09:30";
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
LocalDateTime startDate = LocalDateTime.parse(date, format);

堆栈跟踪

Exception in thread "main" java.time.format.DateTimeParseException: Text '2019-08-07T20:11:59.6250889+09:30' could not be parsed at index 23
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    at java.time.LocalDateTime.parse(LocalDateTime.java:492)
    at Testing.main(Testing.java:11)

标签: javadate

解决方案


您的格式是内置的。

    String date = "2019-08-07T20:11:59.6250889+09:30";
    DateTimeFormatter format = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
    LocalDateTime startDate = LocalDateTime.parse(date, format);
    System.out.println(startDate);

输出:

2019-08-07T20:11:59.625088900

格式为 ISO 8601。用于 ISO 8601 最重要变体的格式化程序内置于 java.time。所以不要为编写自己的格式模式字符串而苦恼。只需使用预定义的DateTimeFormatter.ISO_OFFSET_DATE_TIME.

@shmosel 在评论中是正确的:DateTimeFormatter从字面上获取小数位数,因此要解析您需要的 7 位小数的一小部分SSSSSSS(7 S)。java.time 还具有解析可变小数位数的能力。为此,您需要一个DateTimeFormatterBuilder及其appendFraction方法。

通过您的问题标题,您的意思是您想要UTC时间吗?这将需要显式转换(因为您的字符串与 UTC 的偏移量为 +09:30):

    LocalDateTime startDate = OffsetDateTime.parse(date)
            .withOffsetSameInstant(ZoneOffset.UTC)
            .toLocalDateTime();

2019-08-07T10:41:59.625088900

链接


推荐阅读