python datetime.astimezone行为不正确?

python datetime.astimezone行为不正确?,python,pytz,python-datetime,python-dateutil,Python,Pytz,Python Datetime,Python Dateutil,下面的代码首先从IST中的字符串解析时间,然后将其转换为UTC。因此,当印度的时间是下午4:00时,GMT/UTC的时间是上午10:30。而下面的代码将其打印为晚上9:30。因此,它不是减去偏移量,而是增加偏移量。从astimezone示例实现的python文档中可以看出,如果偏移量为负值,它会添加偏移量,但这似乎与它应该做的相反。文档中说,它调整了时间,使UTC时间保持不变,但在传递的时区的本地时间内,这与示例实现相反 from dateutil.parser import parse fro

下面的代码首先从IST中的字符串解析时间,然后将其转换为UTC。因此,当印度的时间是下午4:00时,GMT/UTC的时间是上午10:30。而下面的代码将其打印为晚上9:30。因此,它不是减去偏移量,而是增加偏移量。从astimezone示例实现的python文档中可以看出,如果偏移量为负值,它会添加偏移量,但这似乎与它应该做的相反。文档中说,它调整了时间,使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)
从dateutil.parser导入解析
从pytz导入时区
d=解析('2015年9月1日星期二16:00:00 GMT+0530')
#打印datetime.datetime(2015,9,1,16,0,tzinfo=tzoffset(无,-19800))
打印d
utc=时区(“utc”)
#打印datetime.datetime(2015,9,1,21,30,tzinfo=)
打印d.astimezone(utc)

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

下面的代码片段可以正常工作

>>> d = parse('Tue Sep 01 2014 16:00:00 GMT+0530')
>>> ind = timezone('Asia/Kolkata')
>>> d=d.replace(tzinfo=ind)
>>> d
datetime.datetime(2015, 9, 1, 16, 0, tzinfo=<DstTzInfo 'Asia/Kolkata' LMT+5:53:00 STD>)
>>> utc = timezone('UTC')
>>> d.astimezone(utc)
datetime.datetime(2015, 9, 1, 10, 7, tzinfo=<UTC>)
>>d=parse('2014年9月1日星期二16:00:00 GMT+0530')
>>>ind=时区(“亚洲/加尔各答”)
>>>d=d.更换(tzinfo=ind)
>>>d
datetime.datetime(2015,9,1,16,0,tzinfo=)
>>>utc=时区(“utc”)
>>>d.astimezone(utc)
datetime.datetime(2015,9,1,10,7,tzinfo=)
在这里,我将
tzinfo
更改为
pytz
格式。确保所有时区均为pytz格式

不过,我不知道为什么IST是LMT+5:53:00。发现多年来的偏移量变化和+5:53很久以前就被使用了,但现在我们使用+5:30。但坦率地说,我对此没有多少想法

astimezone()
是正确的<代码>解析()不正确或输入不明确
parse()
GMT+0530
解释为不推荐使用的POSIX样式
GMT+h
时区格式,其中utc偏移符号是反向的。看

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

>>> 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>)
导入pytz >>>tz=pytz.时区(“亚洲/加尔各答”) >>>本地化(解析('2015年9月1日星期二16:00:00 GMT+0530')。替换(tzinfo=None),is_dst=None) datetime.datetime(2015,9,1,16,0,tzinfo=) >>>_uu.astimezone(pytz.utc) datetime.datetime(2015,9,1,10,30,tzinfo=)
它可能会在不明确或不存在的时间(DST转换期间)失败。如果您知道输入为
GMT+h
格式,请使用第一个代码示例,手动转换为UTC。

由于政治原因,时区会逐月变化。我发现pytz有一个2015.4版本,希望能使IST UTC+5:30。很抱歉,我无法从这个上网本找到源代码。@msw没关系。但在这种情况下,印度应该改变它的时钟时间。一、 在印度,我应该更新我的手表,但我没有,因为政府并没有正式宣布。若政府并没有宣布,为什么派茨改变了这一点?据我所知,印度在独立后都被IST取代了。有一个标准据称符合UTC,但我没有87美元来找到答案。稍后我将查看pytz源代码,并在适当的情况下发送更改请求。你激起了我的好奇心,谢谢。你可能无法发送此更改请求。检查“问题和限制”部分,不要使用
d.replace(tzinfo=pytz\u tz)
而是使用
pytz\u tz.localize()
(对于原始日期时间对象)。