Преобразование строки в LocalDateTime Java 8

Я пытаюсь преобразовать следующую строку в LocalDateTime:

String dateStr = "2020-08-17T10:11:16.908732"; 

DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.nnnnnn");
LocalDateTime dateTime = LocalDateTime.parse(dateStr, format);

Но я получаю следующую ошибку:

java.time.format.DateTimeParseException: Text '2020-08-17T10:11:16.908732' could not be parsed at index 10
    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)

Может ли кто-нибудь помочь посоветовать, как мне правильно форматировать строку в LocalDateTime?

Большое спасибо

2 ответа

Решение

Вам не нужно указывать DateTimeFormatterв этом случае, потому что будет использоваться значение по умолчанию, если вы его вообще не пройдете:

public static void main(String[] args) {
    String dateStr = "2020-08-17T10:11:16.908732";
    LocalDateTime dateTime = LocalDateTime.parse(dateStr);
    System.out.println(dateTime);
}

Этот код выведет 2020-08-17T10:11:16.908732.

Если вы настаиваете на использовании специального DateTimeFormatterрассмотрим T заключив его в одинарные кавычки в шаблоне и не используя наносекундный синтаксический анализ (n) для разбора долей секунды (S), иначе результат может быть неверным.

Сделай это так:

public static void main(String[] args) {
    String dateStr = "2020-08-17T10:11:16.908732"; 
    DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSS");
    LocalDateTime dateTime = LocalDateTime.parse(dateStr, format);
    System.out.println(dateTime);
}

с тем же выходом, что и выше.

Примечание:
результат использования шаблона"yyyy-MM-dd'T'HH:mm:ss.nnnnnn" не будет равно разобранному Stringвместо этого было бы

2020-08-17T10:11:16.000908732

Для вашего данного строкового шаблона DateTime должен быть обновлен "yyyy-MM-dd'T'HH:mm:ss.nnnnnn".

Итак, код должен быть таким:

String dateStr = "2020-08-17T10:11:16.908732"; 

DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.nnnnnn");
LocalDateTime dateTime = LocalDateTime.parse(dateStr, format);

Для получения дополнительных сведений об этом вы можете обратиться к JavaDoc.

Наряду с этим в вашем заданном вводе DateTime используется 6 цифр, поэтому это не может быть наносекунды. Потому что нано - это 1/1000000000. Таким образом, в нем будет не менее 9 цифр. Таким образом, правильным форматом должна быть вторая дробь с 6 цифрами, например "гггг-ММ-дд'Т'ЧЧ: мм: сс.СССССС".

Сравнение конечных результатов:

С узором: "гггг-ММ-дд'Т'ЧЧ: мм: сс.ннннн"

System.out.println(LocalDateTime.parse("2020-08-17T10:11:16.908732", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.nnnnnn")));

Выход: 2020-08-7T10:11:16.000908732

С шаблоном: "гггг-ММ-дд'Т'ЧЧ: мм:ss.SSSSSS"

System.out.println(LocalDateTime.parse("2020-08-17T10:11:16.908732", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSS")));

Выход: 2020-08-7T10:11:16.908732

Другие вопросы по тегам