Почему неправильно конвертировать из строки в дату? - PullRequest
0 голосов
/ 14 января 2019

В моем коде Kotlin:

   const val TS_DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS"
   val ts = responseJsonObject.get("TS").getAsString()
   val tsDate = SimpleDateFormat(TS_DATE_PATTERN).parse(ts)
   val tsDateAsString = SimpleDateFormat(TS_DATE_PATTERN).format(tsDate)
   logger.info("ts = " + ts + " -> tsDate = " + tsDate + " -> tsDateAsString = " + tsDateAsString)

А вот результат (отформатированный для удобства чтения):

ts             = 2019-01-14T22:56:30.429582 
tsDate         = Mon Jan 14 23:03:39 EET 2019 
tsDateAsString = 2019-01-14T23:03:39.582

Как видите, ts и tsDateAsString имеют разное время, хотя они пришли из одной и той же начальной точки.

например. ts = 22:56:30 но в tsDateAsString = 23:03:39

Почему?

1 Ответ

0 голосов
/ 14 января 2019

В качестве рекомендации: всякий раз, когда вы можете, используйте 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...