java 纪元时间转换器

java epoch time convertor

我有以下日期:2016-08-08T00:45:02.370294075Z

我正在尝试使用 .getMillis() 将其转换为纪元,但它会导致精度损失:1470617102370。我的目标是将其转换为 influxdb 有线格式。

还有其他方法吗?

tl;博士

2016-08-08T00:45:02.370294075Z 有纳秒。

2016-08-08T00:45:02.370Z 有毫秒。

Instant

Instant class represents a moment on the timeline in UTC with a resolution of nanoseconds。所以小数点最多九位。

Instant instant = Instant.parse( "2016-08-08T00:45:02.370294075Z" ) ;

毫秒

Milliseconds is a coarser granularity than nanoseconds, providing up to three digits of decimal fraction. So extracting a count of milliseconds 从纪元 (1970-01-01T00:00:00Z) 当然意味着数据丢失,从第六到九位截断任何小数位。

long millisecondsSinceEpoch = instant.toEpochMilli() ;  // 2016-08-08T00:45:02.370Z

纳秒

influxdb 似乎将时间戳写为从 1970 UTC 开始的纳秒数,尽管文档没有明确说明。

Instant class 不会呈现以纳秒为单位的纪元计数,但您可以计算一个。 Instant 由纪元以来的几秒加上几分之几的纳秒组成。所以将第一个乘以十亿然后加上第二个。

注意附加到十亿的 L 将计算转换为 long 而不是 int.

long nanosecondsSinceEpoch = ( instant.getEpochSecond() * 1_000_000_000L ) + instant.getNano() ;