Разбор метки времени как LocalDateTime

Я хочу разобрать временную метку в виде yyyy-MM-dd'T'HH:mm:ss как LocalDateTime. При этом он удаляет секунды, если они есть 00.

Как описано здесь, мне нужно использовать собственный форматтер

LocalDateTime date = LocalDateTime.parse("2008-10-02T12:30:00");
DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");

String dateString = date.toString();
String dateFormatted = date.format(f);

System.out.println(dateString); // 2008-10-02T12:30

Этот работает, но возвращает String:

System.out.println(dateFormatted); // 2008-10-02T12:30:00

Когда я разбираю строку на LocalDateTime, она снова удаляет 00:

LocalDateTime dateLDT = LocalDateTime.parse(dateFormatted, f);
System.out.println(dateLDT); // 2008-10-02T12:30

Итак, как я могу разобрать дату как LocalDateTime вместо String и сохранить 00 в конце?

Нужно разобрать dateFormatted, где проблема? Вы не можете разобрать a LocalDateTime, вы можете только когда-либо анализировать Strings - и эти Strings должны иметь правильный формат. И то, как дата решает перегрузить свой метод toString, не должно иметь для вас значения, поскольку вам всегда нужно использовать средство форматирования, чтобы получить любой правильный формат.

luk2302 01.03.2019 10:45

Я считаю, что DateTimeFormatterBuilder предоставляет необязательные элементы, но вам нужно поиграть с этим

MadProgrammer 01.03.2019 10:45

Кажется, вы хотели распечатать и разобрать dateFormatted, нетdateString

ernest_k 01.03.2019 10:46

@ernest_k: Пожалуйста, посмотрите мое обновление. Он снова обнажает 00-е.

Evgenij Reznik 01.03.2019 10:49
Это не имеет значения — я повторяю то, что уже сказал: «то, как дата решает перегрузить свой метод toString, не должно иметь для вас значения, поскольку вам всегда нужно использовать средство форматирования для получения любого правильного формата».
luk2302 01.03.2019 10:50

@ luk2302: Форматировщик выводит строку, но мне нужно LocalDateTime.

Evgenij Reznik 01.03.2019 10:54
LocalDateTime внутренне использует формат, который нас не волнует, и нет смысла говорить о том, есть в нем секунды или нет. Только его метод toString выдал строку без секунд, если секунды и доли секунд равны нулю.
Ole V.V. 01.03.2019 10:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
2 795
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Каждый объект даты имеет секунды. Независимо от того, решит ли он отображать их с реализацией по умолчанию toString, не имеет значения. Если вам нужен определенный формат, который вам всегда нужно использовать для форматирования.

Если вы хотите увидеть секунды, либо используйте подходящий форматировщик, либо установите точку останова и проверьте объект. Глядя на любойtoString реализация что-либо никогда не гарантирует отображение чего-либо полезного или представление фактического состояния объекта. Объект может просто вернуть случайную строку даты.

Пока вы можете просто использовать date, это прекрасно, у него есть секунды.

Ответ принят как подходящий

Вы должны ожидать разницу в выходе между

LocalDateTime dateLDT = LocalDateTime.parse(dateFormatted, f);
System.out.println(dateLDT);

И

System.out.println(dateLDT.format(f)) //or f.format(dateLDT)

System.out.println(dateLDT); печатает значение dateLDT.toString(), которое, как ожидается, не даст такой же результат, как ваш шаблон.

Когда вы посмотрите на LocalDateTime.toString(), вы увидите, что он делегирует временную часть LocalTime.toString(), которая условно печатает секунды:

public String toString() {
    ...
    if (secondValue > 0 || nanoValue > 0) {
        buf.append(secondValue < 10 ? ":0" : ":").append(secondValue);
        ...
        }
    }
    return buf.toString();
}

Поле секунд просто опускается, если его значение равно 0.

В этом случае вам нужно всегда использовать DateTimeFormatter для форматирования даты, если вы должны быть уверены в формате вывода/ввода.

Привет @ernest_k У меня есть временная метка [ 2020-08-26T11:41:25.310 ]. Как извлечь из него дату? Я могу использовать регулярное выражение, но есть ли для него встроенный метод в новом Java.time?

MdBasha 27.08.2020 09:48

@MdBasha - LocalDateTime.parse("2020-08-26T11:41:25.310").toLocalDate() должен возвращать 2020-08-26 (как объект LocalDate). Просто обратите внимание, что он работает без специального шаблона, потому что 2020-08-26T11:41:25.310 имеет формат по умолчанию, используемый LocalDateTime.

ernest_k 27.08.2020 11:08

Хорошо понимаю. Спасибо!

MdBasha 27.08.2020 11:27

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