第三方API返回不确定单位的Epoch时间,Java日期转换年份异常问题
解决第三方API Epoch时间戳单位(秒/毫秒)不确定的问题
这问题我之前对接第三方API时也踩过坑!明明时间戳看起来没问题,转成日期后年份直接跑到几万年后,一看才发现是把毫秒级的时间戳当成秒来处理了。下面给你一套靠谱的解决方案:
核心思路:通过数值范围判断单位
正常情况下,Epoch时间戳(从1970-01-01 UTC开始计算)的合理范围是有规律的:
- 秒级时间戳:1970年至今(2024年)是10位数字,到2100年也才11位(约
4102444799) - 毫秒级时间戳:是13位数字,对应1970年至今的时间,数值远大于秒级的最大值
所以我们可以先设定一个「合理的秒级时间戳上限」,比如2100年的秒级时间戳,超过这个值的就判定为毫秒级,否则按秒级处理。
完整代码实现
String time = "1519377196185"; // 毫秒级示例 // String time = "1521575819"; // 秒级示例 String timeZone = "US/Pacific"; long epochTimestamp = Long.parseLong(time); Instant instant; // 设定2100-01-01 UTC的秒级时间戳作为判断阈值 long maxReasonableSeconds = 4102444799L; if (epochTimestamp > maxReasonableSeconds) { // 数值超过合理秒级上限,判定为毫秒级 instant = Instant.ofEpochMilli(epochTimestamp); } else { // 数值在合理范围内,按秒级处理 instant = Instant.ofEpochSecond(epochTimestamp); } // 指定时区格式化日期 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") .withZone(ZoneId.of(timeZone)); String formattedDate = formatter.format(instant); System.out.println(formattedDate);
补充说明
- 这个方法覆盖了绝大多数业务场景,除非API返回的是1970年前后的极端时间戳(比如小于1000的毫秒级),这种情况可以额外加长度判断(比如长度小于10的优先按秒级处理)
- 如果能联系到API提供商,最好还是确认文档里的时间戳单位,这是最稳妥的方式
内容的提问来源于stack exchange,提问作者ppb
相关产品推荐
相关产品推荐

