[英]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 ) ;
即時.toString() → 2022-07-21T22:36:46.285Z
Instant
在UTC中,始終在 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.