Я хочу разобрать временную метку в виде 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 в конце?
Я считаю, что DateTimeFormatterBuilder предоставляет необязательные элементы, но вам нужно поиграть с этим
Кажется, вы хотели распечатать и разобрать dateFormatted, нетdateString
@ernest_k: Пожалуйста, посмотрите мое обновление. Он снова обнажает 00-е.
@ luk2302: Форматировщик выводит строку, но мне нужно LocalDateTime.
LocalDateTime внутренне использует формат, который нас не волнует, и нет смысла говорить о том, есть в нем секунды или нет. Только его метод toString выдал строку без секунд, если секунды и доли секунд равны нулю.




Каждый объект даты имеет секунды. Независимо от того, решит ли он отображать их с реализацией по умолчанию 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 - LocalDateTime.parse("2020-08-26T11:41:25.310").toLocalDate() должен возвращать 2020-08-26 (как объект LocalDate). Просто обратите внимание, что он работает без специального шаблона, потому что 2020-08-26T11:41:25.310 имеет формат по умолчанию, используемый LocalDateTime.
Хорошо понимаю. Спасибо!
Нужно разобрать
dateFormatted, где проблема? Вы не можете разобрать aLocalDateTime, вы можете только когда-либо анализироватьStrings - и этиStrings должны иметь правильный формат. И то, как дата решает перегрузить свой методtoString, не должно иметь для вас значения, поскольку вам всегда нужно использовать средство форматирования, чтобы получить любой правильный формат.