Java:Unix秒级时间戳转毫秒级时间戳出错排查
问题分析与解决方案
这种年份显示五万多的诡异问题,大概率是整数溢出导致的,咱们一步步拆解:
最可能的原因:数据类型溢出
10位的Unix秒级时间戳(比如1699999999)本身已经接近int类型的最大值(2147483647,约21亿),当你把它乘以1000时,结果会变成1699999999000,这个数值远远超出了int的范围(int只能存到约2.1e9)。
在Java这类强类型语言中,整数溢出会导致数值被循环截断,变成一个完全错误的负数或者乱码正数。当你把这个错误的数值传给Date或者时间处理类时,它会解析出一个离谱的时间(比如五万多年前/后)。
修复方法
确保你的时间戳变量用long类型存储,并且乘法运算时也用long类型的常量:
// 注意给数值加L,明确标记为long类型 long secTimestamp = 1699999999L; long msTimestamp = secTimestamp * 1000L; Date targetDate = new Date(msTimestamp);
其他可能的排查方向
如果数据类型没问题,再检查这两点:
- 原始时间戳是否真的是秒级:虽然你确认过,但可以验证下原始10位数值对应的实际时间,排除拿到的是错误基准的时间戳(比如非Unix时间戳)。
- isToday()方法的实现逻辑:如果转换后的毫秒数是正确的,但方法判断年份出错,那可能是方法内部的Calendar/DateTimeAPI使用错误,比如错误地使用了
YEAR以外的字段计算年份——不过时区问题通常只会导致日期偏移一天,不会到五万多年,所以优先级较低。
内容的提问来源于stack exchange,提问作者Themelis
相关产品推荐
相关产品推荐

