繁体   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