Java使用LocalDateTime减10天获取epoch时间时分异常问题排查
问题原因
你的代码核心问题是时区偏移不匹配:
LocalDateTime.now()无参调用时获取的是JVM默认时区对应的当前日期时间,这个类本身不存储时区信息,仅代表一个「无时区属性的时间字面量」- 后续调用
toEpochSecond(ZoneOffset.UTC)时,相当于强制把这个本地时区的时间字面量当做UTC时区的时间来计算时间戳,最终得到的结果和实际预期的时间差了你本地时区与UTC的偏移量,自然转换后时分显示不正确。
修复方案
根据你实际需要的时区选择对应写法:
场景1:需要获取本地时区下、10天前相同时分秒对应的时间戳
推荐直接使用带时区的ZonedDateTime避免偏移错误:
long t = ZonedDateTime.now(ZoneId.systemDefault()) .minusDays(10) .toEpochSecond() * 1000;
如果要继续用LocalDateTime写法,需要关联正确的本地时区:
ZoneId localZone = ZoneId.systemDefault(); long t = LocalDateTime.now() .minusDays(10) .atZone(localZone) .toEpochSecond() * 1000;
场景2:需要获取UTC时区下、10天前相同时分秒对应的时间戳
需要从获取时间的第一步就指定UTC时区,避免取到本地时间:
long t = LocalDateTime.now(ZoneOffset.UTC) .minusDays(10) .toEpochSecond(ZoneOffset.UTC) * 1000;
内容的提问来源于stack exchange,提问作者S.Dan
相关产品推荐
相关产品推荐

