【问题标题】:java epoch time convertorjava纪元时间转换器
【发布时间】:2016-08-12 15:21:37
【问题描述】:

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

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

还有其他方法吗?

【问题讨论】:

  • 您看到的结果 IS 以毫秒为单位。 “精度损失”是因为您似乎希望输出纳秒级,而名为 getMillis() 的方法显然不会提供。
  • 我可以用来获得纳秒的任何其他类? org.joda.time.base 不提供任何内容。
  • @Cmarv Joda-Time 已被 java.time 框架取代。 Joda-Time 团队建议迁移到 java.time,因为他们的项目现在位于 maintenance mode。 java.time 类的分辨率为纳秒。

标签: java epoch influxdb


【解决方案1】:

tl;博士

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

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

Instant

Instant 类代表 UTC 时间线上的时刻,分辨率为 nanoseconds。所以小数部分最多九位。

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

毫秒

Milliseconds 是比纳秒更粗的粒度,最多提供三位小数。因此,来自 epoch (1970-01-01T00:00:00Z) 的 extracting a count of milliseconds 当然意味着数据丢失,即截断第 6 位到第 9 位的任何十进制数字。

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

纳秒

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

Instant 类不会以纳秒为单位呈现 epoch 的计数,但您可以计算一个。 Instant 由自纪元以来的若干 while 秒加上几分之一秒中的若干纳秒组成。因此,将第一个乘以十亿并加上第二个。

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

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

【讨论】:

    猜你喜欢
    • 2015-06-21
    • 2021-03-23
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多