簡體   English   中英

如何將雪花時間戳轉換為日期

[英]How to convert Snowflake timestamp to Date

誰能幫我建議如何使用 java 將雪花 ltz 時間戳轉換為給定日期?

雪花 ltz 格式的樣本:1658443006.285000000

使用智能對象,而不是愚蠢的文本

雖然我不使用 Snowflake,但快速查看文檔會發現它們的TIMESTAMP_LTZ類型類似於 SQL 標准類型TIMESTAMP WITH TIME ZONE

java.time.OffsetDateTime

所以Java中合適的類是OffsetDateTime

假設 Snowflake JDBC 驅動程序符合 JDBC 4.2 及更高版本,您可以從數據庫中提取對象而不僅僅是文本。

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

寫入數據庫時​​:

myPreparedStatement.setObject( … , odt ) ;

如果您想在特定時區查看這一時刻,請應用ZoneId以獲取ZonedDateTime

ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

解析文本

你說:

雪花 ltz 格式的樣本:1658443006.285000000

你能引用這方面的文件嗎? 我在他們關於TIMESTAMP_LTZ數據類型的頁面中看不到這種格式。

無論如何,我想你給出的文本代表了自紀元參考以來的整秒數,以及具有納秒分辨率的小數秒。

假設紀元參考是 1970 年的第一個時刻,與 UTC (1970-01-01T00:00Z) 的偏移量為零時分秒,我們可以輕松地將其解析為 Java 中的java.time.Instant對象。 但我強烈建議您使用對象而不是這種方法,如上所述。

將輸入分成兩部分,兩個字符串。 解析每個 64 位long整數。

要進行拆分,我們必須使用一對 REVERSE SOLIDUS 字符來轉義 FULL STOP 字符。

String[] parts = "1658443006.285000000".split( "\\." ) ;
long seconds = Long.parseLong( parts [ 0 ] ) ;
long nanos = Long.parseLong( parts [ 1 ] ) ;

使用工廠方法來實例化Instant對象。

Instant instant = Instant.ofEpochSecond( seconds , nanos ) ;

請參閱在 Ideone.com 上實時運行的代碼

即時.toString() → 2022-07-21T22:36:46.285Z

InstantUTC中,始終在 UTC 中,這意味着偏移量為零。

如果您想在特定時區查看這一時刻,請應用ZoneId以獲取ZonedDateTime

ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

zit.toString() → 2022-07-22T07:36:46.285+09:00[亞洲/東京]

暫無
暫無

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

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