为了账号安全,请及时绑定邮箱和手机立即绑定

将“亚洲/加尔各答”时区日期时间转换为自纪元以来的毫秒数时出错

将“亚洲/加尔各答”时区日期时间转换为自纪元以来的毫秒数时出错

ibeautiful 2023-06-06 15:31:31
亚洲/加尔各答时区的时间为8/8/20, 8:00(%m/%d/%y, %H:%M格式)。我首先将日期时间转换为 UTC 时区,然后更改为毫秒。我将结果与在线(https://www.epochconverter.com/)进行了比较,值存在一些差异。亚洲/加尔各答时区日期时间(输入):8/8/20、8:00UTC 时区日期时间:8/8/20、2:30自纪元以来的毫秒计算值:1596873600000自纪元以来的毫秒实际值:1596853800000Python 脚本:my_time = datetime.strptime(timerangestart, '%m/%d/%y, %H:%M')timestart = my_time.replace(tzinfo=timezone.utc).timestamp()timestart = timestart * 1000我做错了什么?我可以得到一些帮助吗?
查看完整描述

2 回答

?
达令说

TA贡献1821条经验 获得超6个赞

如果替换tzinfo为timezone.utc,Python 将假定8/8/20, 8:00 为UTC。你想要的是astimezone()。如果你不传递时区,它会自动使用你机器的本地时间[docs]。


from datetime import datetime, timezone

timerangestart = '8/8/20, 8:00'


# parse the string and localize to your time zone (OS setting):

my_time = datetime.strptime(timerangestart, '%m/%d/%y, %H:%M').astimezone() 

ts_ms = my_time.timestamp() * 1000 # no need to convert to UTC; UNIX time (should) always refer to UTC

请注意,默认情况下,Python 会假定没有时区 (tzinfo=None) 的日期时间对象属于当地时间 - 因此您甚至可以省略 .astimezone()!但是,我更愿意设置时区,以便更清楚地了解正在发生的事情。


如果你想检查另一个时区,你可以使用dateutil和例如写


from dateutil.tz import gettz


my_time = datetime.strptime(timerangestart, '%m/%d/%y, %H:%M').replace(tzinfo=gettz('US/Eastern'))

ts_ms = my_time.timestamp() * 1000


查看完整回答
反对 回复 2023-06-06
?
倚天杖

TA贡献1828条经验 获得超3个赞

我就是这样解决的


timerangestart = '8/8/20, 8:00'

my_time = datetime.strptime(timerangestart, '%m/%d/%y, %H:%M')

timerangestart = pytz.timezone("Asia/Kolkata").localize(my_time).astimezone(pytz.timezone("UTC")) 

timestart = int(timerangestart.timestamp() * 1000)


查看完整回答
反对 回复 2023-06-06
  • 2 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信