Calendar添加一天后返回错误时间戳问题求助
看起来你遇到的问题核心是混淆了时间戳的单位——Calendar类的timeInMillis字段要求的是毫秒级时间戳,但你在使用过程中把秒级时间戳当成了毫秒来处理,导致添加一天后的结果完全偏离预期。
为什么会出现这个错误?
你日志里的Time1: 1526478465是秒级时间戳(对应2018-05-16 19:17:45),但Calendar的timeInMillis需要的是毫秒级(应该是1526478465000)。当你调用cal2.add(Calendar.DATE, 1)时,Calendar会自动添加一天对应的毫秒数:86400 * 1000 = 86400000。
原本如果是正确的毫秒级时间戳,添加后应该是1526478465000 + 86400000 = 1526564865000(对应2018-05-17 19:17:45),但因为你用了秒级时间戳赋值,计算后得到1526478465 + 86400000 = 1612878465——这个数字如果被当成秒级时间戳解析,就会对应2021年的日期,这就是你看到错误结果的原因。
修复步骤
统一时间戳单位
如果你的原始时间戳是秒级的,必须先转换为毫秒再赋值给timeInMillis:val cal = Calendar.getInstance() // 假设你从接口/其他地方拿到的是秒级时间戳 val secondsTimestamp = 1526478465L cal.timeInMillis = secondsTimestamp * 1000 // 转换为毫秒级优化日志打印,避免单位混淆
直接打印格式化后的日期,而不是纯数字时间戳,这样能直观验证结果:import java.text.SimpleDateFormat import java.util.Locale // ... val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss E", Locale.getDefault()) val cal2 = Calendar.getInstance() cal2.timeInMillis = cal.timeInMillis Log.e("Time1", "${sdf.format(cal.time)} (${cal.timeInMillis})") cal2.add(Calendar.DATE, 1) Log.e("Time2", "${sdf.format(cal2.time)} (${cal2.timeInMillis})")确认添加逻辑的正确性
你使用cal2.add(Calendar.DATE, 1)来添加一天的逻辑本身是完全正确的,只要时间戳单位正确,就能得到预期的结果。
额外建议
如果你的项目是基于Android或Java 8+,更推荐使用java.time包下的API(比如LocalDateTime、Instant),它们的API设计更清晰,能避免这类单位混淆的问题:
import java.time.Instant import java.time.LocalDateTime import java.time.ZoneId import java.time.format.DateTimeFormatter // 秒级时间戳转LocalDateTime val instant = Instant.ofEpochSecond(1526478465L) val dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()) // 添加一天 val nextDay = dateTime.plusDays(1) // 格式化输出 val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss E") Log.e("Time1", dateTime.format(formatter)) Log.e("Time2", nextDay.format(formatter))
内容的提问来源于stack exchange,提问作者varmashrivastava

