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

Calendar获取时间异常:API24以上设备返回日期滞后一天

问题分析与解决方案

这个问题我之前也碰到过,根源出在你使用的Calendar.HOUR字段上,结合API24+系统对Calendar字段处理逻辑的微调,导致了日期偏移的问题。

问题原因

Calendar.HOUR是12小时制的字段,取值范围是0-11(对应上午0点到11点,下午12点到11点对应0-11+PM标记)。当你直接给它设置18这个超出范围的值时,Calendar会自动进行日期和时段的调整:在API24+的版本中,这个调整逻辑会把18小时转换成第二天的6点(18-12=6),同时切换到PM时段,最终导致你获取的日期多了一天。

而API24及以下版本的Calendar对超出范围的HOUR值处理逻辑不同,没有触发日期的自动调整,所以结果符合预期。

修复方案

把Calendar.HOUR替换为Calendar.HOUR_OF_DAY,这是24小时制的字段,取值范围0-23,可以直接设置你想要的18点,不会触发日期调整:

修改后的设置日期代码:

myCalendar.set(Calendar.YEAR, 2018 );
myCalendar.set(Calendar.DAY_OF_MONTH, 3);
myCalendar.set(Calendar.MONTH, 0); // 注意:Calendar的月份是0基,0代表1月,这里设置是正确的
myCalendar.set(Calendar.HOUR_OF_DAY, 18); // 替换为24小时制的HOUR_OF_DAY
myCalendar.set(Calendar.MINUTE, 30);
// 建议额外设置秒和毫秒为0,避免默认随机值干扰结果
myCalendar.set(Calendar.SECOND, 0);
myCalendar.set(Calendar.MILLISECOND, 0);

另外,你的日期解析部分可以简化,不需要用StringTokenizer,直接替换分隔符就能得到想要的格式:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
String dates = sdf.format(myCalendar.getTime());
// 直接替换斜杠得到ddMMyyyy格式
String reversedDate = dates.replace("/", "");

额外建议

如果你的项目兼容API26+,或者可以引入ThreeTenABP库兼容低版本,非常建议使用Java 8引入的java.time新日期时间API——它比Calendar和SimpleDateFormat更直观、线程安全,能彻底避免这类旧API的设计坑:

// 设置日期时间(月份是1基,更符合日常认知)
LocalDateTime dateTime = LocalDateTime.of(2018, 1, 3, 18, 30, 0);
// 格式化日期
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
String dates = dateTime.format(formatter);
String reversedDate = dates.replace("/", "");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:45:36