MySQL中无法将Epoch时间-28800000转换为标准时间求助
解决MySQL转换1970年前Epoch时间的问题
问题根源
MySQL的FROM_UNIXTIME()函数仅支持1970-01-01 00:00:00 UTC之后的UNIX时间戳(即数值≥0),对于小于0的时间戳会直接返回NULL,这就是你尝试方法a、b失败的原因。而方法c通过DATE_ADD从UTC起始时间计算的思路是可行的,但返回的是UTC时间,需要进一步转换为新加坡时区(GMT+08:00)。
通用解决方案
使用CASE语句做条件判断,区分1970年前后的时间戳分别处理,既兼容正常记录,又能解决1970年前时间的转换:
基础转换(带时区)
SELECT CASE WHEN epoch_col >= 0 THEN CONVERT_TZ(FROM_UNIXTIME(epoch_col / 1000), '+00:00', '+08:00') ELSE CONVERT_TZ( DATE_ADD('1970-01-01 00:00:00', INTERVAL (epoch_col / 1000) SECOND), '+00:00', '+08:00' ) END AS converted_time FROM your_table;
格式化输出(如YYYY-MM-DD HH:mm:ss)
SELECT CASE WHEN epoch_col >= 0 THEN DATE_FORMAT(CONVERT_TZ(FROM_UNIXTIME(epoch_col / 1000), '+00:00', '+08:00'), '%Y-%m-%d %H:%i:%s') ELSE DATE_FORMAT( CONVERT_TZ( DATE_ADD('1970-01-01 00:00:00', INTERVAL (epoch_col / 1000) SECOND), '+00:00', '+08:00' ), '%Y-%m-%d %H:%i:%s' ) END AS converted_time FROM your_table;
说明
- 替换
epoch_col为你表中的Epoch时间字段名,your_table为表名。 - 如果依赖系统时区(已设置为新加坡时间),可以将
'+08:00'替换为'SYSTEM',但直接写时区偏移更稳定,避免系统时区变更影响结果。 - 针对你提供的
-28800000毫秒值,转换后得到的新加坡时区时间为1970-01-01 00:00:00,若和你在线查询结果不符,需确认Epoch值是否正确(注:-28800000毫秒等于-8小时,对应UTC时间为1969-12-31 16:00,加8小时后为新加坡时间1970-01-01 00:00)。
内容的提问来源于stack exchange,提问作者wokalap
相关产品推荐
相关产品推荐

