LocalDateTime转Instant出现值不一致问题排查
问题原因及解决方案
核心原因
你遇到的问题是时区不匹配导致的:
Instant.now()和System.currentTimeMillis()都是基于UTC(协调世界时)的纪元时间,计算出来的结果是正确的UTC纪元秒减去60秒。LocalDateTime.now()默认获取的是你系统默认时区的本地时间(从你的结果差值来看,你的系统时区应该是UTC+3),但你调用toEpochSecond(ZoneOffset.UTC)时,是把这个本地时间直接当作UTC时间来转换,相当于多算了对应时区偏移的秒数,所以结果比其他值大10800秒(3小时)。
修复方案
方案1:获取LocalDateTime时指定UTC时区
让LocalDateTime从一开始就基于UTC时间,转换时用UTC偏移量就不会有误差:
val now3 = LocalDateTime.now(ZoneOffset.UTC).minusSeconds(60).toEpochSecond(ZoneOffset.UTC)
方案2:转换时使用系统默认时区的偏移量
保持获取和转换时的时区一致,使用系统默认时区的偏移量:
val now3 = LocalDateTime.now().minusSeconds(60).toEpochSecond(ZoneId.systemDefault().rules.getOffset(Instant.now()))
更推荐的方式:直接使用Instant处理纪元时间
如果你的业务是处理纪元时间,直接用Instant会更直观,完全避免时区混淆:
val now3 = Instant.now().minusSeconds(60).epochSecond
内容的提问来源于stack exchange,提问作者Emmanuel Mtali
相关产品推荐
相关产品推荐

