Java 8 Instant truncatedTo方法与Calendar置零结果不一致问题
问题根因
Instant是不带时区信息的UTC时间戳类,调用truncatedTo(ChronoUnit.DAYS)时,会按照UTC时区规则截断到当日零点,而非你运行环境所用的CEST时区。- CEST为中欧夏令时,比UTC早2小时,因此UTC零点对应CEST时间为当日2点,和你预期的结果存在2小时偏差。
- 旧版
Calendar默认使用JVM的系统本地时区(即你环境的CEST)计算时间,设置HOUR_OF_DAY为0时直接对应CEST时区零点,所以结果符合预期。
正确重构代码
如果要和旧版Calendar逻辑完全一致(沿用系统默认时区),参考写法如下:
System.out.println(Date.from(new Date().toInstant() .atZone(ZoneId.systemDefault()) .truncatedTo(ChronoUnit.DAYS) .toInstant()));
如果需要固定时区避免跨环境差异,可将ZoneId.systemDefault()替换为对应时区的标准ID,比如CEST时区对应ZoneId.of("Europe/Paris")。
内容的提问来源于stack exchange,提问作者Sofiane
相关产品推荐
相关产品推荐

