JDK11中Date转ZonedDateTime后纳秒值不准确问题求助
JDK 11中Date与ZonedDateTime转换纳秒不一致的解决方案
问题原因
java.util.Date的精度仅为毫秒级,它内部仅存储从UTC纪元开始的毫秒数。而ZonedDateTime支持纳秒级精度,当你将ZonedDateTime转成Date时,毫秒以下的微秒、纳秒部分会被截断丢失;再从Date转回ZonedDateTime时,只能在毫秒后补全6个0,因此出现纳秒值末尾六位不一致的情况。
解决方案
方案1:必须使用Date时的兼容处理
如果业务场景无法替换Date类,可手动保留毫秒以下的纳秒部分,在转回ZonedDateTime时补全:
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneOffset.UTC); // 提取毫秒之外的纳秒部分(0-999999范围) int nanoRemainder = zonedDateTime.getNano() % 1_000_000; // 转换为Date Date date = Date.from(zonedDateTime.toInstant()); // 转回ZonedDateTime并补回丢失的纳秒部分 ZonedDateTime restoredZonedDateTime = ZonedDateTime.ofInstant(date.toInstant(), ZoneOffset.UTC) .withNano(date.toInstant().getNano() + nanoRemainder);
方案2:优先使用Java 8+新时间API
放弃java.util.Date,全程使用ZonedDateTime、Instant等Java 8引入的新时间类,这些类原生支持纳秒级精度,从根源上避免精度丢失问题:
// 直接用ZonedDateTime处理所有时间逻辑 ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneOffset.UTC); // 后续操作无需转换为Date,直接使用ZonedDateTime即可
内容的提问来源于stack exchange,提问作者Rahul Sharma
相关产品推荐
相关产品推荐

