gpt4 book ai didi

java - Cassandra Java 日期问题

转载 作者:行者123 更新时间:2023-12-02 09:06:50 31 4
gpt4 key购买 nike

我有一个日期字符串,现在我想在 Cassandra 数据库的时间戳列中保留相同的日期时间。在 cqlsh 查询中,时间戳显示与实际时间戳不同。我使用简单的日期格式化程序 SimpleDateFormat("E MMM dd HH:mm:ss yyyy") 解析它并存储。

例如:字符串日期:2020 年 1 月 15 日星期三 14:29:00,在数据库中:2020-01-16 05:50:40.000000+0000

有时,我收到此错误:DateOverFlowWarning:某些时间戳大于 Python 日期时间可以表示的值。时间戳以从纪元开始的毫秒为单位显示。

最佳答案

警告:我不使用 Cassandra。但这也许会有所帮助。

数据类型

正如您所知,当您的数据库支持适当的日期时间数据类型时,不要将日期时间值存储为文本。

文本格式

而且,仅供引用,您表示日期时间值的格式很糟糕。将日期时间值序列化为文本时,请使用标准 ISO 8601格式。

时刻与日期与时间

另一个问题:您正在尝试使用 timestamp in Cassandra 类型来跟踪时刻,但是您存储的字符串(例如 Wed Jan 15 14:29:00 2020)并不是一个时刻。如果没有时区或与 UTC 的偏移量,我们无法知道下午 2:30 的时间是日本东京的下午 2:30 还是美国俄亥俄州托莱多的下午 2:30,这是两个截然不同的时刻几个小时分开。

如果您知道该日期和时间的预期时区,请应用 ZoneId 来获取 ZonedDateTime。我假设使用 UTC(零小时-分钟-秒的偏移量)。

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;

查看此code run live at IdeOne.com .

数据库

如果您有支持 JDBC 4.2 及更高版本的 Cassandra 驱动程序,您应该能够直接提交此 java.time 对象。

myPreparedStatement.setObject( … , odt ) ;

如果没有,您可以获得自 1970 UTC 第一个时刻的纪元引用以来的毫秒数。

long milliseconds = odt.toInstant().toEpochMilli() ;

milliseconds: 1579098540000

走向另一个方向。

Instant instant = Instant.ofEpochMilli( milliseconds ) ;

getting this error: DateOverFlowWarning: Some timestamps are larger than Python datetime can represent

我只能猜测。工具链中的某个位置有一个 Python 库。我认为该库仅限于使用 32 位整数。但对于 Cassandra timestamp 值,您需要一个 64 位整数来表示自 1970-01-01T00:00Z 以来的毫秒数。

<小时/>

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

<小时/>

关于java.time

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

要了解更多信息,请参阅 Oracle Tutorial 。并在 Stack Overflow 上搜索许多示例和解释。规范为JSR 310 .

Joda-Time项目,现在位于 maintenance mode ,建议迁移到java.time类。

您可以直接与数据库交换java.time对象。使用JDBC driver符合JDBC 4.2或稍后。不需要字符串,不需要 java.sql.* 类。

从哪里获取java.time类?

关于java - Cassandra Java 日期问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59756048/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com