卡桑德拉Java日期问题
我有一个日期作为字符串,现在我想在Cassandra db的时间戳列中保留相同的datetime。在cqlsh查询中,时间戳显示为与实际时间戳不同。 我正在使用简单的日期格式化程序SimpleDataFormat(“E-MMM-dd-HH:mm:ss-yyyy”)对其进行解析并存储 示例:字符串日期:2020年1月15日星期三14:29:00, 单位:db:2020-01-1605:50:40.000000+0000卡桑德拉Java日期问题,java,cassandra,cassandra-3.0,Java,Cassandra,Cassandra 3.0,我有一个日期作为字符串,现在我想在Cassandra db的时间戳列中保留相同的datetime。在cqlsh查询中,时间戳显示为与实际时间戳不同。 我正在使用简单的日期格式化程序SimpleDataFormat(“E-MMM-dd-HH:mm:ss-yyyy”)对其进行解析并存储 示例:字符串日期:2020年1月15日星期三14:29:00, 单位:db:2020-01-1605:50:40.000000+0000 有时,我也会遇到这样的错误:DateOverFlowWarning:有些时间戳
有时,我也会遇到这样的错误:DateOverFlowWarning:有些时间戳比Python datetime所能表示的要大。时间戳从历元开始以毫秒为单位显示。注意:我不使用Cassandra。但这或许会有所帮助 数据类型 正如您所了解的,当数据库支持适当的日期时间数据类型时,不要将日期时间值存储为文本 文本格式 而且,仅供参考,表示日期时间值的格式非常糟糕。将日期时间值序列化为文本时,请使用标准格式 时刻与日期以及一天中的时间 另一个问题:您正试图使用type跟踪时刻,但存储的字符串(如
Wed Jan 15 14:29:00 2020
)不是时刻。如果没有时区或UTC偏移的背景,我们无法知道几乎下午2:30的时间是日本东京的下午2:30还是美国俄亥俄州托莱多的下午2:30,两个截然不同的时刻相隔几个小时
如果您知道该日期和时间的预期时区,请应用ZoneId
以获取zoneDateTime
。我将假设UTC(零小时分秒的偏移量)是预期的
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;
看这个
数据库
如果您有一个支持JDBC 4.2及更高版本的Cassandra驱动程序,您应该能够直接提交这个java.time对象
myPreparedStatement.setObject( … , odt ) ;
如果不是,则可以获得自1970 UTC第一时刻的历元引用以来的毫秒计数
long milliseconds = odt.toInstant().toEpochMilli() ;
毫秒:157909854000
往另一个方向走
Instant instant = Instant.ofEpochMilli( milliseconds ) ;
获取此错误:DateOverFlowWarning:某些时间戳大于Python datetime可以表示的时间戳
我只能猜测。工具链中的某个地方有一个Python库。我假设该库仅限于使用32位整数。但是您需要一个64位整数来表示自1970-01-01T00:00Z以来Cassandra时间戳值的毫秒计数
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是
该项目现已启动,建议迁移到类
您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*
类
从哪里获得java.time类
- 、和更高版本-标准Java API的一部分,带有捆绑实现。
- Java9添加了一些次要功能和修复
- 及
- 大多数java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(