Datetime 为什么从字符串到日期的转换不正确?

Datetime 为什么从字符串到日期的转换不正确?,datetime,kotlin,Datetime,Kotlin,在我的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).form

在我的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)
这里是(为可读性而格式化)结果:

正如您所看到的,tstsDateAsString具有不同的时间,尽管它们来自相同的起点

例如,
ts=22:56:30
但在
tsDateAsString=23:03:39


为什么?

建议:只要有可能,就使用-utilities

具有毫秒的特殊处理。由
S
解析的所有内容都被视为毫秒。只要处理3位毫秒,一切都很好(您甚至可以在毫秒内使用一个
S
(即
.S
)来解析它们),但是如果使用6位毫秒作为输入,那么您也会得到一个6位毫秒(!)值

6位数的毫秒实际上是3位数的秒+3位数的毫秒。这就是偏差的来源

如何解决这个问题?或者缩短输入时间字符串并失去一些精度,或者使用首选的模式来匹配您的输入,即
yyyy-MM-dd'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.valueOf(LocalDateTime.from(tsDate))

建议:尽可能使用-实用程序

具有毫秒的特殊处理。由
S
解析的所有内容都被视为毫秒。只要处理3位毫秒,一切都很好(您甚至可以在毫秒内使用一个
S
(即
.S
)来解析它们),但是如果使用6位毫秒作为输入,那么您也会得到一个6位毫秒(!)值

6位数的毫秒实际上是3位数的秒+3位数的毫秒。这就是偏差的来源

如何解决这个问题?或者缩短输入时间字符串并失去一些精度,或者使用首选的模式来匹配您的输入,即
yyyy-MM-dd'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.valueOf(LocalDateTime.from(tsDate))

@Alexei根据您的实际问题调整了答案。我还需要将tsDate(临时Accessor)转换为时间戳。我如何做到这一点?
Timestamp.valueOf(LocalDateTime.from(tsDate/*解析的一个*/)
@Alexei如果您认为需要将SQL数据库转换为
Timestamp
,您可能错了。JDBC处理自4.2版以来的
LocalDateTime
和其他java.time类型。一个现代的JPA实现也是如此。@Alexei根据您的实际问题调整了答案。我还需要将tsDate(TemporalAccessor)转换为时间戳。我如何做到这一点?
Timestamp.valueOf(LocalDateTime.from(tsDate/*解析的一个*/)
@Alexei如果您认为需要将SQL数据库转换为
Timestamp
,您可能错了。JDBC处理自4.2版以来的
LocalDateTime
和其他java.time类型。现代的JPA实现也是如此。