自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();
为了查询服务,我们需要再次使用时间微秒,然后执行以下操作:
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));
LocalDateTime
通常 不是 您想要做的。使用ZonedDateTime
表示一个时刻,时间线上的特定点,因为LocalDateTime
根据定义不能表示。我无法想象任何情况下调用LocalDateTime.now()
是正确的做法。请参阅:Instant和LocalDateTime之间的区别是什么? - Basil Bourque