这是首先从 IST 中的字符串解析时间然后将其转换为 UTC 的代码。所以当它在印度下午 4:00 时,格林威治标准时间/UTC 时间是上午 10:30。虽然以下代码将其打印为 9:30 pm。因此,不是减去偏移量,而是添加偏移量。从 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/