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
相关产品推荐
相关产品推荐

