【发布时间】:2019-12-16 02:56:41
【问题描述】:
自 Java 9 以来,Java 日期和时间 API 发生了变化。 LocalDateTime 现在具有微秒精度。
Java 9 有一个全新的 java.time.Clock 实现,能够以小于毫秒(小数点的三位数字)的分辨率捕获当前时刻。
我们从后端服务获取时间(以微秒为单位)。
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();
为了查询服务,我们再次需要 time 微秒,然后我们这样做
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));
【问题讨论】:
-
使用 Instant.ofEpochSecond() 代替 Instant.ofEpochMilli()。一个有两个参数:自纪元以来的秒数,以及额外的纳秒。
-
一种可能,但是如何从 timeMicros long 中获取 epochSeconds 和 nanoAdjustment?
-
秒:将 timeMicros 除以一百万。纳秒:以 timeMicros 为模,以一百万为模得到微秒。然后将结果乘以一千。
-
顺便说一句,以这种方式使用
LocalDateTime更像是不是你想要做的。使用ZonedDateTime表示时刻,时间轴上的特定点,因为LocalDateTime根据定义不能。我想不出任何用例调用LocalDateTime.now()是正确的做法。见:What's the difference between Instant and LocalDateTime?
标签: java java-9 java-time java-11 java.time.instant