gpt4 book ai didi

python datetime.astimezone 行为不正确?

转载 作者:行者123 更新时间:2023-11-28 17:33:52 32 4
gpt4 key购买 nike

这是首先从 IST 中的字符串解析时间然后将其转换为 UTC 的代码。因此,当印度下午 4:00 时,格林威治标准时间/UTC 时间为上午 10:30。而以下代码将其打印为晚上 9:30。因此,不是减去偏移量,而是添加偏移量。来自 python 文档 https://docs.python.org/2/library/datetime.html#datetime.datetime.astimezone astimezone 的示例实现,如果它是负数,它确实会添加偏移量,但这似乎与它应该做的相反。该文档说它会调整时间,使 UTC 时间保持不变,但在经过的时区的本地时间中,这与示例实现相反。

from dateutil.parser import parse
from pytz import timezone

d = parse('Tue Sep 01 2015 16:00:00 GMT+0530')

# Prints datetime.datetime(2015, 9, 1, 16, 0, tzinfo=tzoffset(None, -19800))
print d

utc = timezone('UTC')

# Prints datetime.datetime(2015, 9, 1, 21, 30, tzinfo=<UTC>)
print d.astimezone(utc)

我不确定哪里出了问题。是 astimezone 的实现还是文档或偏移量本身的符号颠倒了?

最佳答案

astimezone() 是正确的。 parse() 不正确或输入不明确。 parse()GMT+0530 解释为已弃用的 POSIX 风格 GMT+h 时区格式,其中 utc 偏移符号被反转。参见 Timezone offset sign reversed by Python dateutil?

要修复它,请使用相反的符号:

>>> from dateutil.parser import parse
>>> d = parse('Tue Sep 01 2015 16:00:00 GMT+0530')
>>> utc = d.replace(tzinfo=None) + d.utcoffset() #NOTE: the opposite sign
>>> utc
datetime.datetime(2015, 9, 1, 10, 30)

如果输入可能是明确的(当 parse() 返回正确的结果时),那么您不应该手动更改 utc 偏移符号。您可以去除时区并重新应用它:

>>> import pytz
>>> tz = pytz.timezone('Asia/Kolkata')
>>> tz.localize(parse('Tue Sep 01 2015 16:00:00 GMT+0530').replace(tzinfo=None), is_dst=None)
datetime.datetime(2015, 9, 1, 16, 0, tzinfo=<DstTzInfo 'Asia/Kolkata' IST+5:30:00 STD>)
>>> _.astimezone(pytz.utc)
datetime.datetime(2015, 9, 1, 10, 30, tzinfo=<UTC>)

它可能会因不明确或不存在的时间而失败(在 DST 转换期间)。如果您知道输入的格式为 GMT+h,则使用第一个代码示例并手动转换为 UTC。

关于python datetime.astimezone 行为不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32374060/

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