如何从纪元微秒或纳秒创建 Java Instant?

ayu*_*504 2 java timestamp

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

ayu*_*504 9

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

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);
}
Run Code Online (Sandbox Code Playgroud)

测试用例:

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
Run Code Online (Sandbox Code Playgroud)

  • 对于 nanos IIRC,您可以简单地执行“Instant.ofEpochSecond(0, nanosSinceEpoch)”。对于微单位而不是“1000_000L”,我更喜欢“TimeUnit.SECONDS.toMicros(1)”。感谢您分享您的解决方案,我基本上喜欢它。 (2认同)
  • 它有效(至少对我来说):`Instant.ofEpochSecond(0, 1_500_000_000_123_456_789L)`产生`2017-07-14T02:40:00.123456789Z`,与您报告的结果相同。[文档](https://docs.oracle.com/javase/9​​/docs/api/java/time/Instant.html#ofEpochSecond-long-long-) 说:“此方法允许任意数量的纳秒被传进去。” (2认同)