gpt4 book ai didi

python - 为什么此代码依赖于我的本地计算机时区?

转载 作者:行者123 更新时间:2023-12-01 03:38:11 25 4
gpt4 key购买 nike

为什么这段代码:

def parse_date(datetime_string, tz_code):
tz = timezone(tz_code)
datetime_obj = parser.parse(datetime_string)
datetime_obj_localized = datetime_obj.replace(tzinfo=tz)
return time.mktime(datetime_obj_localized.timetuple())


def test_parse_date(self):
self.assertEquals(1482951600, parse_date('2016-12-28 14:00', 'US/Eastern')

根据运行机器的时区返回不同的值?

根据我的理解,解析器返回一个没有时区的日期时间,然后分配一个 tz,不更改任何其他内容,最后将其转换为时间戳。我的本地 tz 不应在任何地方使用。

最佳答案

dateutil.parser 当且仅当它找到一个时区时才会附加一个时区,这可能取决于您的本地计算机时区设置,因为如果它检测到缩写如果您所在时区的缩写列表中包含诸如“EST”之类的时区,它会假定这就是您所指的时区。

也就是说,这不是本例中发生的情况。即使 parser 附加了时区,datetime.replace 也会对时区进行批量替换,而不是转换。我认为您的问题中没有足够的信息来完全诊断此问题,但如果 timezone()pytz.timezone(),则至少您的问题之一是无法使用 replacepytz 时区附加到 datetime 对象。您需要改用 datetime_obj = pytz.timezone(tz_code).localize(datetime_obj)

请注意,localize 方法假定您有一个时区原生对象,因此如果 datetutil 的解析器返回时区感知,它将抛出错误>datetime,因此您应该将 ignoretz=True 传递给解析器以防止出现这种情况。

也就是说,即使您执行了此操作,真正的问题仍在于您对 time.mktime 的使用。请参阅this answer ,这是完全相同的问题。总结一下这个答案,最好的办法是使用calendar.timegm而不是mktime,并在调用之前转换为UTC。结合我的建议,这是您的代码的更新版本:

import calendar
from dateutil.tz import tzutc

def parse_date(datetime_string, tz_code):
tz = timezone(tz_code)
datetime_obj = parser.parse(datetime_string, ignoretz=True)
datetime_obj_localized = tz.localize(datetime_obj)

datetime_obj_utc = datetime_obj_localized.astimezone(tzutc())
return calendar.timegm(datetime_obj_utc.timetuple())

关于python - 为什么此代码依赖于我的本地计算机时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40070757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com