有没有人可以帮助我建议如何使用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[亚洲/东京]