Java 8 LocalDateTime сбрасывает значение 00 секунд при разборе значения строки даты с 00 секундами, например «2018-07-06 00:00:00» - PullRequest
0 голосов
/ 10 июня 2018

Приведенный ниже фрагмент кода (Java 8) отбрасывает часть секунд моего времени даты , если значение секунд равно нулю в пределах даты, проанализированной с помощью LocalDateTime.parse , например, 2018-07-10 00: 00: 00 :

final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
final LocalDateTime localDateTime = LocalDateTime.parse("2018-07-06 00:00:00", dateTimeFormatter);
final String lexicalDate = localDateTime.toString();
System.out.println("Lexical Date : "+ lexicalDate);
final XMLGregorianCalendar gregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(lexicalDate);
System.out.println("Gregorian Calendar : "+ gregorianCalendar);

Лексическая дата печатается как:

Лексическая дата: 2018-07-10T00: 00

вместо:

Лексическая дата: 2018-07-10T00: 00: 00

Теперь это влияет на значение даты в григорианском календаре, которое возвращает ноль при отбрасывании секунды.В других случаях, когда значение секунд больше нуля, оно отлично работает.

javax.xml.datatype.DatatypeFactory.newInstance().newXMLGregorianCalendar(lexicalDate)

Приведенный выше код возвращает значение null всякий раз, когда значение секунд сбрасывается из-за значения 00 секунд в проанализированной строке.

Может кто-нибудь помочь с лучшим способом решения этой проблемы с использованием времени LocalDate, в противном случае это может быть ошибка / забавный элемент управления в Java 8 LocalDateTime.

Обратите внимание, у меня нет контроля над этимзначение даты, оно исходит от сторонней платформы.

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Вам нужно отформатировать дату с правильным форматером вместо того, чтобы использовать значение по умолчанию, вызвав toString().

final String lexicalDate = localDateTime.format(dateTimeFormatter);
0 голосов
/ 10 июня 2018

Функция, а не ошибка

Вы видите документированное поведение конкретного DateTimeFormatter, используемого методом LocalDateTime::toString.

Выдержка, мой акцент:

На выходе будет один из следующих форматов ISO-8601 :

uuuu-MM-dd'T'HH: мм

uuuu-MM-dd'T'HH: мм: сс

uuuu-MM-dd'T'HH: мм: сс.SSS

uuuu-MM-dd'T 'ЧЧ: мм: ss.SSSSSS

uuuu-MM-dd'T'HH: мм: ss.SSSSSSSSS

Используемый формат будет самым коротким , который выводитполное значение времени, когда пропущенные части подразумеваются равными нулю .

Если вы хотите, чтобы другое поведение при генерации строки представляло значение вас LocalDateTime, используйте другой DateTimeFormatter и передайте его в LocalDateTime::format.

String output = myLocalDateTime.format( someOtherFormatter ) ;

LocalDateTime не имеет «формат» какэто не текст.Задача DateTimeFormatter - анализировать или генерировать String объекты определенного формата.

...