java - 从微秒创建 Java DateTime Instant

标签 java java-9 java-time java-11 java.time.instant

自 Java 9 以来,Java 日期和时间 API 发生了变化。 LocalDateTime 现在具有微秒精度。

Java 9 has a fresh implementation of java.time.Clock capable of capturing the current moment in resolution finer than milliseconds (three digits of decimal fraction).

我们从后端服务获取以微秒为单位的时间。

System.currentTimeMillis  > 1565245051795    > 2019-08-08T06:17:31.795
Service.getTime           > 1565245051795306 > 2019-08-08T06:17:31.795306

为了构造要在我们的应用程序中使用的 LocalDateTime,我们这样做

long timeMicros = service.getTime();
long timeMillis = timeMicros / 1000;
LocalDateTime ldt = Instant.ofEpochMilli(timeMillis).atZone(ZoneId.systemDefault()).toLocalDateTime();

为了查询服务,我们再次需要时间微秒,然后我们就这样做

long timeMillis = dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
long timeMicros = timeMillis * 1000;

问题是我们无法取回时间微秒精度。

是否可以创建微秒精度的 Instant?
我们现在使用 Java 11。当我们的一个 JUnit 测试由于微秒精度的提高而失败时,我注意到了这一变化。

对于 JUnit 测试,我找到了一个解决方法:

private static final LocalDateTime START = LocalDateTime.now().truncatedTo(ChronoUnit.MILLIS);


我不确定这是否是一种解决方法或实际的解决方案,但添加时间戳的最后三微秒数字似乎可行。

long micros = 306L; //TODO get the last three digits from the timeMicros
ldt.plus(micros, ChronoUnit.MICROS));

最佳答案

    long timeMicros = 1_565_245_051_795_306L;
    Instant i = Instant.EPOCH.plus(timeMicros, ChronoUnit.MICROS);
    System.out.println(i);

输出是:

2019-08-08T06:17:31.795306Z

编辑:而不是通过除法和乘法将微秒转换为毫秒和/或秒,我更喜欢使用对微秒的内置支持。此外,当明确地将它们添加到纪元时,感觉有点手持。

您已经知道如何将 Instant 转换为 LocalDateTime,您已经在问题中展示了它,所以我不再重复。

编辑:

Do you have a solution to get the timeMicros back from the Instant?

有几个选项。这样计算就不那么复杂了,所以我可能会这样做:

    long microsBack = TimeUnit.SECONDS.toMicros(i.getEpochSecond())
            + TimeUnit.NANOSECONDS.toMicros(i.getNano());
    System.out.println(microsBack);

1565245051795306

为了使第一次转换更加时尚,您可能更喜欢稍微短一点的:

    long microsBack = ChronoUnit.MICROS.between(Instant.EPOCH, i);

编辑:可能是挑剔,但也是为了避免任何人误解:LocalDateTime 始终具有纳秒精度。在 Java 8 上,只有 now 方法具有毫秒精度。我在某处读到,从 Java 9 开始,精度随平台而变化,但你是对的,微秒精度似乎很典型。

关于java - 从微秒创建 Java DateTime Instant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57411881/

相关文章:

java - java.time.ZoneId 是否有原因不包括 ZoneIds 的枚举?

java - 使用 @DateTimeFormat 的日期时间解析问题

java - 如何为列表中的每个元素同时运行方法

java exchange operator 临时

java - Jasper Reports 是否适用于 Java 9

java - Java 9 中不推荐使用 Observer。我们应该使用什么来代替它?

java - 字节码是否知道 Java 版本

java - 在 Unity Project 之间共享数据到 Android Studio java 代码

java - 部分 mock 的替代品?

java - java中的字符串到OffsetDateTime解析