Использование встроенных деталей
Написание собственной строки шаблона формата не только иногда сложно, но и всегда подвержено ошибкам. Я рекомендую вместо этого собрать ваш форматтер из встроенных частей:
String toParse = "2019-07-16 13:29:15.111";
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE)
.appendLiteral(' ')
.append(DateTimeFormatter.ISO_LOCAL_TIME)
.toFormatter();
LocalDateTime timestamp = LocalDateTime.parse(toParse, formatter);
System.out.println(timestamp);
Вывод:
2019-07-16T13: 29: 15.111
Это работает без десятичных знаков вообще (2019-07-16 13:29:15
) и всего от одного десятичного знака (2019-07-16 13:29:15.1
) до девяти десятичных знаков (2019-07-16 13:29:15.123456789
). Он работает даже без секунд (2019-07-16 13:29
).
Если вы хотите, чтобы сгенерировал исключение для 4 или более десятичных знаков, вам нужно использовать appendFraction()
, как в ответе Deadpool.
Он находится в документации DateTimeFormatter.ISO_LOCAL_TIME
:
Формат состоит из:
- Две цифры для часа дня. Он дополняется нулями, чтобы обеспечить две цифры.
- Двоеточие
- Две цифры для минуты часа. Он дополняется нулями, чтобы обеспечить две цифры.
- Если секунда минуты недоступна, то формат завершен.
- Двоеточие
- Две цифры за секунду. Он дополняется нулями, чтобы обеспечить две цифры.
- Если нано секунды равен нулю или недоступен, то формат завершен.
- Десятичная точка
- От одной до девяти цифр для нано секунды. При необходимости будет выведено столько цифр, сколько потребуется.
Почему здесь не работают квадратные скобки
Вы не можете заключить квадратные скобки в середину строки повторений одного и того же формата шаблона письма. [.[S[S[S]]]]
понимается как необязательно точка, за которой необязательно следуют одна-десятая git доли секунды, за которой, возможно, следует одна -ди git доля секунды, за которой, возможно, следует одна-ди git доля секунды. Как отметил Sweeper в комментарии, он может работать без исключения, если дробь равна .111
, но, вероятно, будет восприниматься как .1
, при этом 1
указывается три раза. И сломается, если три цифры не равны. Вместо этого вы могли бы сойти с [.[SSS][SS][S]]
для необязательного десятичного знака, за которым следовали либо 3, 2, либо 1 десятичный знак. Сначала нужно поставить 3 знака после запятой.
Ссылка