如何识别不同时区毫秒时间戳的时区并转换至UTC+0?
如何识别时间戳的原始时区并转换为UTC+0
哈哈,这个坑我之前踩过!先给你掰明白一个关键常识:标准的毫秒时间戳本身不带时区属性——它本质就是从UTC 1970-01-01 00:00:00开始流逝的毫秒数,是个绝对时间点。你现在遇到的问题,大概率是这两个时间戳被错误生成了:生成它们的机器直接把本地时间当成UTC时间来转成戳,而不是先把本地时间转成UTC再生成。
第一步:反推原始时区
既然你知道每个时间戳对应的原始本地时间,那就可以通过对比「时间戳解析出的UTC时间」和「原始本地时间」的差值,算出原始时区:
拿你的两个例子来说:
处理Date_1
- 时间戳:
1525694035615 - 原始本地时间:
Mon May 07 2018 11:53:55
用Python解析时间戳到UTC时间:
import datetime timestamp1 = 1525694035615 / 1000 # Python用秒级时间戳,所以除以1000 utc_time1 = datetime.datetime.utcfromtimestamp(timestamp1) # 输出:2018-05-07 08:53:55.615000
计算本地时间和UTC时间的差值:11:53:55 - 08:53:55 = +3小时,所以Date_1的原始时区是UTC+3。
处理Date_2
- 时间戳:
1525686835730 - 原始本地时间:
Mon May 07 2018 09:53:55
同样解析到UTC:
timestamp2 = 1525686835730 / 1000 utc_time2 = datetime.datetime.utcfromtimestamp(timestamp2) # 输出:2018-05-07 07:53:55.730000
差值是09:53:55 - 07:53:55 = +2小时,所以Date_2的原始时区是UTC+2。
第二步:把错误的时间戳转换成正确的UTC+0时间戳
现在我们知道了原始时区,要修正时间戳很简单:因为错误的时间戳是把本地时间当成UTC生成的,所以我们需要把这个“伪UTC时间”转换回真正的UTC时间——也就是减去时区偏移的毫秒数。
还是用Python示例:
修正Date_1(UTC+3时区)
# 错误的时间戳(被当成UTC的本地时间) wrong_ts1 = 1525694035615 # UTC+3的偏移量:3小时 = 3*3600*1000 = 10800000毫秒 correct_utc_ts1 = wrong_ts1 - 10800000 # 验证:correct_utc_ts1对应的UTC时间是2018-05-07 08:53:55.615,正好是原始本地时间(UTC+3)对应的UTC时间
修正Date_2(UTC+2时区)
wrong_ts2 = 1525686835730 # UTC+2的偏移量:2*3600*1000 = 7200000毫秒 correct_utc_ts2 = wrong_ts2 - 7200000 # 验证:correct_utc_ts2对应的UTC时间是2018-05-07 07:53:55.730,符合预期
通用逻辑(任何语言都适用)
- 把给定的时间戳解析成UTC时间(所有语言的时间戳解析工具默认都会把戳当成UTC)
- 对比解析出的UTC时间和已知的原始本地时间,算出时区偏移量(本地时间 - UTC时间 = 偏移量,正数是东时区,负数是西时区)
- 用错误的时间戳减去时区偏移的毫秒数,得到正确的UTC时间戳
重要提醒
- 如果没有对应的原始本地时间,完全没法仅靠时间戳反推原始时区——因为时间戳是绝对UTC时间,同一个UTC时间在不同时区会显示不同的本地时间,但戳本身是唯一的。
- 一定要确保你拿到的原始本地时间是准确的,不然时区计算肯定错。
内容的提问来源于stack exchange,提问作者Anton Konikov
相关产品推荐
相关产品推荐

