日期格式将2019-08-07T20:11:59.6250889 + 09:30解析为UTC Java LocalDateTime

时间:2019-08-07 02:49:20

标签: java date

我试图转换日期字符串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)

1 个答案:

答案 0 :(得分:1)

您的格式是内置的。

    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

格式为ISO8601。用于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

链接