我有以下日期:2016-08-08T00:45:02.370294075Z
我尝试使用 .getMillis()
将其转换为纪元,但会导致精度损失:1470617102370
。我的目标是将其转换为 influxdb 有线格式。
还有其他办法吗?
最佳答案
tl;博士
2016-08-08T00:45:02.370294075Z
具有纳秒。
2016-08-08T00:45:02.370Z
有毫秒。
即时
Instant
类代表 UTC 时间轴上的一个时刻,分辨率为 nanoseconds 。因此小数部分最多可达九位。
Instant instant = Instant.parse( "2016-08-08T00:45:02.370294075Z" ) ;
毫秒
Milliseconds是比纳秒更粗的粒度,提供最多三位小数。所以extracting a count of milliseconds from epoch (1970-01-01T00:00:00Z) 当然意味着数据丢失,即六到九位的任何十进制数字被截断。
long millisecondsSinceEpoch = instant.toEpochMilli() ; // 2016-08-08T00:45:02.370Z
纳秒
influxdb 似乎将时间戳写入从 1970 UTC 开始的纳秒数,尽管文档没有明确说明。
Instant
类不会呈现以纳秒为单位的纪元计数,但您可以计算一个。一个Instant
由纪元以来的若干个while秒加上若干秒的纳秒组成。因此,将第一个乘以十亿,然后加上第二个。
请注意 10 亿后面附加的 L
,以将计算转换为 long
而不是 int
。
long nanosecondsSinceEpoch = ( instant.getEpochSecond() * 1_000_000_000L ) + instant.getNano() ;
关于java 纪元时间转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38921391/