【问题标题】:Error while converting 'Asia/Kolkata' timezone datetime to miliseconds since epoch将“亚洲/加尔各答”时区日期时间转换为自纪元以来的毫秒数时出错
【发布时间】:2020-12-08 16:12:57
【问题描述】:

亚洲/加尔各答时区的时间是8/8/20, 8:00%m/%d/%y, %H:%M 格式)。我首先将日期时间转换为 UTC 时区,然后更改为毫秒。我对比了网上的结果(https://www.epochconverter.com/),数值有一些差异。

亚洲/加尔各答时区日期时间(输入):8/8/20, 8:00
UTC 时区日期时间:8/8/20, 2:30
自 Epoch 以来的毫秒计算值:1596873600000
自 Epoch 以来的实际毫秒值:1596853800000

Python 脚本:

my_time = datetime.strptime(timerangestart, '%m/%d/%y, %H:%M')
timestart = my_time.replace(tzinfo=timezone.utc).timestamp()
timestart = timestart * 1000

我做错了什么?我可以得到一些帮助吗?

【问题讨论】:

    标签: python datetime


    【解决方案1】:

    如果您将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
    

    【讨论】:

    • 我确实尝试了第一个代码,但结果还是一样。
    • @Jasmine:使用 dateutil 本地化到您的特定时区怎么样,您也尝试过吗?
    【解决方案2】:

    我就是这样解决的

    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)
    

    【讨论】:

      猜你喜欢
      • 2020-10-28
      • 1970-01-01
      • 2013-08-19
      • 2014-03-14
      • 2020-08-03
      • 2011-08-31
      • 2017-02-19
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多