簡體   English   中英

Cassandra Java 日期問題

[英]Cassandra Java date issue

我有一個日期作為字符串,現在我想在 Cassandra db 的時間戳列中保留相同的日期時間。 在 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格式。

時刻與日期與時間

另一個問題:您正在嘗試使用Cassandra 中的類型timestamp來跟蹤時刻,但是您存儲的字符串(例如Wed Jan 15 14:29:00 2020 )不是時刻。 如果沒有時區的上下文或與 UTC 的偏移量,我們無法知道大約下午 2:30 的時間是日本東京的下午 2:30 還是美國俄亥俄州托萊多的下午 2:30,這是兩個截然不同的幾個小時的時刻分開。

如果您知道該日期和時間的預期時區,請應用ZoneId以獲取ZonedDateTime 我將假設 UTC(零時分秒的偏移量)是有意的。

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

查看此代碼在 IdeOne.com 上實時運行

數據庫

如果您有支持 JDBC 4.2 及更高版本的 Cassandra 驅動程序,您應該能夠直接提交這個java.time對象。

myPreparedStatement.setObject( … , odt ) ;

如果沒有,您可以獲得自 1970 UTC 第一個時刻的紀元參考以來的毫秒數。

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

毫秒:1579098540000

走向另一個方向。

Instant instant = Instant.ofEpochMilli( milliseconds ) ;

收到此錯誤:DateOverFlowWarning:某些時間戳大於 Python 日期時間可以表示

我只能猜測。 工具鏈中的某個地方是一個 Python 庫。 我想該庫僅限於使用 32 位整數。 但是對於 Cassandra timestamp值,您需要一個 64 位整數來表示自 1970-01-01T00:00Z 以來的毫秒數。


Java(舊版和現代版)和標准 SQL 中的日期時間類型表


關於java.time

java.time框架內置於 Java 8 及更高版本中。 這些類取代麻煩的老傳統日期時間類,如java.util.DateCalendar ,和SimpleDateFormat

要了解更多信息,請參閱Oracle 教程 並在 Stack Overflow 上搜索許多示例和解釋。 規范是JSR 310

現在處於維護模式Joda-Time項目建議遷移到java.time類。

您可以直接與您的數據庫交換java.time對象。 使用符合JDBC 4.2或更高版本的JDBC 驅動程序 不需要字符串,不需要java.sql.*類。

從哪里獲得 java.time 類?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM