You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:48:03