Hack нет.1
String withMillis = "2019-02-14 11:04:52.784";
String withMicros = "2019-02-14 11:04:52.784108";
System.out.println(LocalDateTime.parse(withMillis.replace(' ', 'T')));
System.out.println(LocalDateTime.parse(withMicros.replace(' ', 'T')));
2019-02-14T11:04:52.784
2019-02-14T11:04:52.784108
Когда мы заменяем пробел в середине вашей строки на T
, строка соответствует ISO 8601, стандартному формату LocalDateTime
и другие классы java.time анализируют (и также печатают) по умолчанию, то есть без какого-либо явного средства форматирования.Так что это простое решение.
Взломать нет.2
Нечто подобное тому, что вы пробовали, можно заставить работать.Только вы не можете разбить последовательность SSSSSS
с квадратной скобкой посередине.
static final DateTimeFormatter DATE_TIME_FORMATTER =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.[SSSSSS][SSS]");
И затем:
System.out.println(LocalDateTime.parse(withMillis, DATE_TIME_FORMATTER));
System.out.println(LocalDateTime.parse(withMicros, DATE_TIME_FORMATTER));
Я могу указать дополнительно 6 десятичных знаков, а затем, возможно, 3 десятичных знака.Нам нужен этот заказ.Если мы введем [SSS][SSSSSS]
и попытаемся выполнить синтаксический анализ 6 десятичных разрядов, модуль форматирования сначала проанализирует 3, а затем сгенерирует исключение, поскольку он не может проанализировать оставшиеся 3 с помощью SSSSSS
.Это что-то вроде хака, поскольку он также примет десятичную точку без десятичных дробей вообще и, вероятно, выдаст очень запутанное сообщение об ошибке (или, возможно, даже даст неправильный результат), если мы дадим ему 9 десятичных знаков.
Хорошее решение: используйте строитель
static final DateTimeFormatter DATE_TIME_FORMATTER =
new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE)
.appendLiteral(' ')
.appendPattern("HH:mm:ss")
.appendFraction(ChronoField.NANO_OF_SECOND, 1, 9, true)
.toFormatter();
Здесь я указал минимум 1 и максимум 9 десятичных знаков после десятичной точки.Вы можете указать 3 и 6, если хотите.Конечно, он также принимает 4 или 5.
Ссылка: Статья в Википедии: ISO 8601