Cassandra Java date issue

问题描述 投票:0回答:1

我有一个日期作为字符串,现在我想在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可以代表的时间戳。时间戳以毫秒为单位显示。

java cassandra cassandra-3.0
1个回答
0
投票

您似乎已经了解到,当数据库支持适当的日期时间数据类型时,请勿将日期时间值存储为文本。

而且,仅供参考,您用于表示日期时间值的格式非常糟糕。将日期时间值序列化为文本时,请使用标准的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 ) ;

Table of date-time types in Java (both legacy and modern) and in standard SQL


关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Datejava.util.DateCalendar

要了解更多信息,请参见Calendar。并在Stack Overflow中搜索许多示例和说明。规格为SimpleDateFormat

SimpleDateFormat项目现在位于Oracle Tutorial中,建议迁移到JSR 310类。

您可以直接与数据库交换java.time对象。使用兼容Joda-Time或更高版本的maintenance mode。不需要字符串,不需要java.time类。

从哪里获取java.time类?

© www.soinside.com 2019 - 2024. All rights reserved.