如何获取LocalDateTime的完整纳秒值(类似toEpochSecond的纳秒版本)?
解决LocalDateTime转纳秒精度Long的问题
嘿,这个需求我太熟悉了!你之前的思路是对的——LocalDateTime必须先转成带时区的Instant(毕竟LocalDateTime本身没有时区信息,没法直接对应到纪元时间),但你只拿到了秒内的纳秒段,是因为没把秒数和纳秒数结合起来。
其实很简单,我们可以把Instant的秒数转换成纳秒,再加上秒内的纳秒部分,就能得到从1970-01-01T00:00:00Z开始的总纳秒数,完全等价于toEpochSecond但精度到纳秒:
// 示例代码 LocalDateTime myLocalDateTime = LocalDateTime.of(2024, 5, 20, 15, 30, 45, 123456789); Instant instant = myLocalDateTime.toInstant(ZoneOffset.UTC); // 计算总纳秒数 long totalNanos = instant.getEpochSecond() * 1_000_000_000L + instant.getNano();
为什么这样可行?
instant.getEpochSecond():获取从纪元开始的总秒数instant.getNano():获取当前秒内的纳秒偏移量(范围0~999,999,999)- 把秒数乘以10^9转成纳秒,再加上偏移量,就得到了完整的纳秒级时间戳
小提醒
Long类型的最大值是9,223,372,036,854,775,807,而截至2024年,纪元以来的总纳秒数大概是5.5e17,所以这个计算在未来几十年内都不会溢出,但如果处理非常久远的时间(比如几百年后),可能需要考虑用BigDecimal之类的类型来存储哦。
内容的提问来源于stack exchange,提问作者timothyclifford
相关产品推荐
相关产品推荐

