如何将雪花时间戳转换为日期



有没有人可以帮助我建议如何使用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数据类型的页面上没有看到这样的格式。

无论如何,我认为您给出的文本代表了自epoch参考以来的整秒数,以及具有纳秒分辨率的分数秒。

假设epoch引用是1970年的第一个时刻,与UTC (1970-01-01T00:00Z)相差0小时-分钟-秒,我们可以很容易地将其解析为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。

instant.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 - 22 - t07:36:46.285 + 9[亚洲/东京]

最新更新