【问题标题】:java.sql.Timestamp to Microseconds (Long with precision till Microseconds)java.sql.Timestamp 到微秒(精确到微秒的长)
【发布时间】:2019-03-21 16:43:27
【问题描述】:

我已经查看了来自 here 的问题及其解决方案,但看起来解决方案来自 2013 年,我正在寻找比这更好的解决方案。

如何将 Oracle 中的 DateTime(TimeStamp) 转换为 Long,精确到微秒?

为了。例如: 来自 Oracle 的时间戳为:“2018-10-31 14:30:12.123456”。我需要它来将其转换为 Long:1541010612123456。

I/P: "2018-10-31 14:30:12.123456" // String
O/P: 1541010612123456 // Long

我试过了

java.sql.Timestamp.valueOf("2018-10-31 14:30:12.123456").getTime

但这给了我精确到毫秒的精度:1541010612123

为了解决这个问题,我尝试了类似的方法,它有效,但不确定它是否是一个好的解决方案。

val timeStamp = java.sql.Timestamp.valueOf("2018-10-31 14:30:12.123456").toInstant
val requiredLong = (timeStamp.getEpochSecond.toString + (timeStamp.getNano/1000).toString).toLong

任何更好的建议或解决方案。

【问题讨论】:

  • 考虑使用LocalDateTime 而不是Timestamp
  • 是的,我会这么做的。
  • 如果您可以从 Oracle 检索 OffsetDateTimeInstantLocalDateTime 并完全避免过时且令人困惑的 Timestamp 类,那就更好了。使用 JDBC 4.2 兼容的驱动程序应该是可能的。

标签: java sql scala jdbc timestamp


【解决方案1】:

您可以使用 TimeUnit 进行此转换:

Instant instant = java.sql.Timestamp.valueOf("2018-10-31 14:30:12.123456").toInstant();  
long micros = TimeUnit.SECONDS.toMicros(instant.getEpochSecond()) + TimeUnit.NANOSECONDS.toMicros(instant.getNano());

【讨论】:

  • 如果您无法避免Timestamp 类(以及随之而来的时区问题的风险),这绝对是一个很好的解决方案。读起来一目了然,并且避免了精度损失。
猜你喜欢
  • 2014-01-11
  • 1970-01-01
  • 2015-06-25
  • 2013-02-03
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多