Asia/Kolkata时区时间转Epoch毫秒值错误,请求技术排查
问题分析与解决方案
你的问题出在时区设置的逻辑错误上:你直接把解析后的无时区时间标记成了UTC时区,但实际上这个时间是Asia/Kolkata时区的,这就导致timestamp计算完全偏离了正确值。
错误原因拆解
你写的代码:
my_time = datetime.strptime(timerangestart, '%m/%d/%y, %H:%M') timestart = my_time.replace(tzinfo=timezone.utc).timestamp()
这里的replace(tzinfo=timezone.utc)相当于告诉Python:“这个8:00是UTC时间”,但实际上这个时间是Asia/Kolkata时区的8点(对应UTC2:30)。所以你计算出来的是UTC8:00的毫秒数(1596873600000),而不是你需要的Kolkata8:00对应的UTC时间的毫秒数。
正确实现步骤
要解决这个问题,需要分两步:
- 给解析后的无时区时间绑定Asia/Kolkata时区
- 将其转换为UTC时区后再计算timestamp
方案1:使用Python 3.9+内置的zoneinfo模块(推荐)
from datetime import datetime import zoneinfo timerangestart = '8/8/20, 8:00' # 1. 解析时间(此时是无时区的naive datetime) my_time = datetime.strptime(timerangestart, '%m/%d/%y, %H:%M') # 2. 绑定Asia/Kolkata时区 kolkata_tz = zoneinfo.ZoneInfo('Asia/Kolkata') my_time_kolkata = my_time.replace(tzinfo=kolkata_tz) # 3. 转换为UTC时区 my_time_utc = my_time_kolkata.astimezone(zoneinfo.ZoneInfo('UTC')) # 4. 计算毫秒数 timestart = my_time_utc.timestamp() * 1000 print(timestart) # 输出:1596853800000,和在线工具结果一致
方案2:使用pytz模块(兼容Python 3.9以下版本)
注意pytz推荐用localize方法来绑定时区,避免夏令时等问题:
from datetime import datetime import pytz timerangestart = '8/8/20, 8:00' my_time = datetime.strptime(timerangestart, '%m/%d/%y, %H:%M') # 绑定Asia/Kolkata时区 kolkata_tz = pytz.timezone('Asia/Kolkata') my_time_kolkata = kolkata_tz.localize(my_time) # 转换为UTC my_time_utc = my_time_kolkata.astimezone(pytz.utc) # 计算毫秒数 timestart = my_time_utc.timestamp() * 1000 print(timestart) # 输出:1596853800000
这样就能得到和在线工具一致的正确结果了。
内容的提问来源于stack exchange,提问作者Jasmine
相关产品推荐
相关产品推荐

