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

Java Calendar获取今日前10天并设置12:00时间失败问题排查

问题出在这两个关键地方,给你捋清楚并修正

首先,你的代码之所以会出现「设置午夜后日期回到当日」的问题,核心原因是错误使用了Calendar的字段和调整方式,具体来说:


1. 用Calendar.HOUR计算跨天时间是致命错误

Calendar.HOUR是12小时制的字段(取值范围0-11,还要配合AM_PM字段区分上午/下午),你试图通过cal.get(Calendar.HOUR) - 240来减去10天的小时数,这种做法完全不符合Calendar的设计逻辑。虽然Calendar会自动尝试调整超出范围的字段值,但12小时制和24小时跨度的计算不匹配,会导致日期调整的结果完全偏离预期——可能你以为已经调到10天前了,但实际上这个操作根本没正确修改日期,后续设置午夜自然就回到当日了。

2. 应该用add()做相对时间调整,而非直接set()字段

Calendar.set()是直接给字段赋值,而add()才是专门用来做「相对时间增减」的方法,它会正确处理日期/时间的滚动(比如跨月、跨年)。


修正后的正确代码

方案一:直接减去10天(最直观推荐)

既然目标是10天前的午夜,直接对天数做减法最不容易出错:

Calendar cal = Calendar.getInstance();
// 先调整到10天前
cal.add(Calendar.DAY_OF_MONTH, -10);
// 再设置为午夜(把时分秒毫秒都置0,确保精确)
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

方案二:用24小时制字段减小时数

如果你非要用小时来计算,一定要用HOUR_OF_DAY(24小时制字段)配合add():

Calendar cal = Calendar.getInstance();
// 减去240小时(10天),add方法会正确处理日期滚动
cal.add(Calendar.HOUR_OF_DAY, -240);
// 同样设置为午夜
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

额外建议:Java 8+ 用java.time替代Calendar

Calendar的API设计很反人类,容易踩坑。如果你的项目用的是Java 8及以上,强烈推荐使用java.time包下的类,代码更清晰易懂:

// 获取当前时间,减去10天,然后截断到天(即午夜0点)
LocalDateTime tenDaysAgoMidnight = LocalDateTime.now()
    .minusDays(10)
    .truncatedTo(ChronoUnit.DAYS);

内容的提问来源于stack exchange,提问作者Geoff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:00:11