我有一个日期作为字符串,现在我想在Cassandra db的时间戳列中保留相同的日期时间。在cqlsh查询中,时间戳显示为与实际时间戳不同。我正在使用简单的日期格式化程序SimpleDateFormat(“ E MMM dd HH:mm:ss yyyy”)进行解析并存储。
ex:String date:2020年1月15日星期三14:29:00在db中:2020-01-16 05:50:40.000000 + 0000
有时,我会收到此错误:DateOverFlowWarning:一些时间戳大于Python datetime可以代表的时间戳。时间戳以毫秒为单位显示。
您似乎已经了解到,当数据库支持适当的日期时间数据类型时,请勿将日期时间值存储为文本。
而且,仅供参考,您用于表示日期时间值的格式非常糟糕。将日期时间值序列化为文本时,请使用标准的ISO 8601格式。
[另一个问题:您正在尝试在Cassandra中使用类型timestamp
来跟踪时刻,但是诸如Wed Jan 15 14:29:00 2020
之类的存储字符串不是时刻。如果没有时区或从UTC偏移的背景,我们无法知道近2:30 PM的时间是日本东京的2:30 PM还是美国俄亥俄州的托莱多的2:30 PM,这是几个小时的完全不同的时刻分开。
如果您知道该日期和时间的预期时区,请应用ZoneId
以获得ZonedDateTime
。我将假定使用UTC(零时分-秒-秒)。
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;
如果您有支持JDBC 4.2及更高版本的Cassandra驱动程序,则应该可以直接提交此java.time对象。
myPreparedStatement.setObject( … , odt ) ;
如果没有,您可以得到自1970年UTC的第一时刻的纪元参考以来的毫秒数。
long milliseconds = odt.toInstant().toEpochMilli() ;
朝另一个方向。
Instant instant = Instant.ofEpochMilli( milliseconds ) ;
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,java.util.Date
和Calendar
。
要了解更多信息,请参见Calendar
。并在Stack Overflow中搜索许多示例和说明。规格为SimpleDateFormat
。
SimpleDateFormat
项目现在位于Oracle Tutorial中,建议迁移到JSR 310类。
您可以直接与数据库交换java.time对象。使用兼容Joda-Time或更高版本的maintenance mode。不需要字符串,不需要java.time类。
从哪里获取java.time类?
java.sql.*
,Java SE 8和更高版本-具有捆绑实施的标准Java API的一部分。