ChronoUnit.NANOS 不支持 LocalDateTime/LocalDate,因其缺乏时间轴锚定;正确做法是先转 Instant 再用 Duration.between().toNanos() 获取纳秒差。
ChronoUnit.NANOS 不支持 LocalDateTime / LocalDate
直接调用
会抛出
,因为
和
不保存时区或时钟信息,其精度虽到纳秒,但
仅定义在
或带完整时间线语义的类型上(如
、
)。它不是“取纳秒字段相减”的快捷方式,而是代表时间线上以纳秒为单位的跨度——这要求输入必须锚定在统一的时间轴上。
→ 返回
,合法
→ 抛出异常,不合法
正确做法:先转成 Instant,再用 Duration.toNanos()
要获得两个时刻之间精确的纳秒差,核心是把它们对齐到同一时间轴(UTC 时间线),即转为
。注意:必须显式指定时区,因为
本身无时区含义。
若原始数据是
,需用
或更明确的
若已是
或
,直接调用
得到两个
后,用
——这是唯一能可靠返回精确纳秒整数的方法
示例:
为什么不用 ChronoUnit.between(..., ..., ChronoUnit.NANOS)?
的三参数重载(
)在 JDK 9+ 才引入,且
仍**不接受**
。它只对实现了
并支持纳秒级时间线偏移的类型有效,比如
。
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
立即学习
“
Java免费学习笔记(深入)
”;
这个三参数方法本质是调用目标类型的
,而
明确抛异常
即使传入
,也建议优先用
,因为
是专为时间差设计的类型,语义清晰、无歧义
虽然可用,但返回的是
,无法表示超过 ±292 年的差值(溢出风险),而
内部用
两字段,
会做安全检查并抛
容易被忽略的精度陷阱
纳秒差看似“精确”,但实际受限于源头数据的精度和系统时钟能力:
只提供毫秒级,转成
后纳秒位全为 0;别指望靠
“造出”更高精度
的纳秒部分来自系统时钟,多数 JVM 在非特殊硬件下达不到真纳秒分辨率
跨时区转换(如夏令时边界)可能导致
计算结果符合物理时间线,但与人类直觉不符——例如 2023-11-05 01:30 美国东部时间“重复出现两次”,必须确认原始
对应的是哪个
真正需要纳秒级差值的场景极少,多数时候
或
配合
更实用、更安全。
ChronoUnit.NANOS.between(a, b)UnsupportedTemporalTypeExceptionLocalDateTimeLocalDateChronoUnit.NANOSInstantInstantZonedDateTimeChronoUnit.NANOS.between(Instant.ofEpochSecond(0), Instant.ofEpochSecond(1))1_000_000_000ChronoUnit.NANOS.between(LocalDateTime.now(), LocalDateTime.now().plusSeconds(1))InstantLocalDateTimeLocalDateTime.atZone(ZoneId.systemDefault()).toInstant().atZone(ZoneId.of("Asia/Shanghai"))ZonedDateTimeOffsetDateTime.toInstant()InstantDuration.between(i1, i2).toNanos()LocalDateTime start = LocalDateTime.of(2024, 1, 1, 12, 0, 0, 123456789);
LocalDateTime end = LocalDateTime.of(2024, 1, 1, 12, 0, 1, 987654321);
Instant i1 = start.atZone(ZoneId.systemDefault()).toInstant();
Instant i2 = end.atZone(ZoneId.systemDefault()).toInstant();
long nanos = Duration.between(i1, i2).toNanos(); // 结果为 1_864_085_432
ChronoUnit.between()between(Temporal, Temporal, TemporalUnit)ChronoUnit.NANOSLocalDateTimeTemporalInstantuntil()LocalDateTime.until(..., NANOS)InstantDuration.between().toNanos()DurationChronoUnit.NANOS.between(i1, i2)longDurationseconds + nanostoNanos()ArithmeticExceptionSystem.currentTimeMillis()InstanttoNanos()LocalDateTime.now()InstantLocalDateTimeInstantDuration.toMillis()toNanosPart()getSeconds()