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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:54:52