В качестве рекомендации: всякий раз, когда вы можете, используйте java.time
-utilities.
SimpleDateFormat
имеет специальную обработку для миллисекунд. Все, что анализируется S
, обрабатывается как миллисекунды. Пока вы имеете дело с 3-значными миллисекундами, все в порядке (вы можете даже использовать одну S
(т.е. .S
) для миллисекунд для их анализа), но если вы используете 6-значные миллисекунды как затем вы также получите 6-значную миллисекунду (!) - значение.
Тогда 6-значные миллисекунды - это фактически 3-значные секунды + 3-значные миллисекунды. Вот откуда исходит отклонение.
Как это решить? Либо либо сократите строку времени ввода и потеряйте некоторую точность, либо используйте вместо этого предпочтительный DateTimeFormatter
с шаблоном, совпадающим с вашим вводом, т.е. yyyy-MM-dd'T'HH:mm:ss.SSSSSS
:
val TS_DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS"
val formatter = DateTimeFormatter.ofPattern(TS_DATE_PATTERN)
val tsDate = formatter.parse(ts) // now the value as you would expect it...
Преобразование этого в TimeStamp
будет работать следующим образом:
Timestamp.valueOf(LocalDateTime.from(tsDate))