【问题标题】:How do I create Java Instant from epoch microseconds or nanoseconds?如何从纪元微秒或纳秒创建 Java Instant?
【发布时间】:2019-09-27 13:16:36
【问题描述】:

我正在尝试为我的项目标准化时间戳格式,其中源以微秒精度报告。我试图找出是否有不需要使用手写常量的干净或最小方法。

【问题讨论】:

  • ... 喜欢,Instant.ofEpochMilli()?
  • 问题与标题不符,没有任何意义。请改写您的问题,以清楚地说明您的问题。
  • 如果您发现除法/模数复杂或不可读,为什么不使用TimeUnit 枚举为您进行转换?
  • 我在寻找微型和纳米,而不是毫秒。我是 Java 日期时间转换套件的新手,所以我不确定除了在整个程序中进行计算之外最干净的方法是什么。
  • @Slaw 好建议。让我试试。

标签: java timestamp


【解决方案1】:

感谢您的建议。这是我能想到的最干净的:

static Instant getInstantFromMicros(Long microsSinceEpoch) {
  return Instant.ofEpochSecond(TimeUnit.MICROSECONDS.toSeconds(microsSinceEpoch), TimeUnit.MICROSECONDS.toNanos(Math.floorMod(microsSinceEpoch, TimeUnit.SECONDS.toMicros(1))));
}

static Instant getInstantFromNanos(Long nanosSinceEpoch) {
  return Instant.ofEpochSecond(0L, nanosSinceEpoch);
}

测试用例:

System.out.println(getInstantFromMicros(1_500_000_000_123_456L));
// 2017-07-14T02:40:00.123456Z

System.out.println(getInstantFromNanos(1_500_000_000_123_456_789L));
// 2017-07-14T02:40:00.123456789Z

【讨论】:

  • 对于 nanos IIRC,您只需执行 Instant.ofEpochSecond(0, nanosSinceEpoch)。对于微型而不是1000_000L,我更喜欢TimeUnit.SECONDS.toMicros(1)。感谢您分享您的解决方案,我基本上喜欢它。
  • @OleV.V.谢谢让我试试这个建议。显然没有Instant.ofEpochSecond(0, nanosSinceEpoch),实际上是Instant.ofEpochSecond(epochSecond, nanoAdjustment)
  • 它有效(至少对我而言):Instant.ofEpochSecond(0, 1_500_000_000_123_456_789L) 产生 2017-07-14T02:40:00.123456789Z,与您报告的结果相同。 The documentation 说:“这种方法允许传入任意数量的纳秒。”
  • @OleV.V.这就说得通了。我在 JDK 11 中验证了这一点,它可以工作。它更多地清理了我的解决方案,所以我更新了我的答案。
  • 这已成为一个美丽的答案,谢谢。抱歉,我不能再次投票。
猜你喜欢
  • 2019-12-16
  • 2017-11-06
  • 1970-01-01
  • 2020-07-21
  • 2015-07-20
  • 2019-11-25
  • 2018-12-14
  • 2019-03-01
  • 2017-12-06
相关资源
最近更新 更多