开发者

inconsistency when switching between timezones in python

开发者 https://www.devze.com 2023-01-12 14:38 出处:网络
I have a datetime object created like this: tm = datetime.datetime.strptime(\'2010 Aug 04 14:15:16\', \'%Y %b %d %H:%M:%S\')

I have a datetime object created like this:

tm = datetime.datetime.strptime('2010 Aug 04 14:15:16', '%Y %b %d %H:%M:%S')
>>> tm
datetime.datetime(2010, 8, 4, 14, 15, 16)

I then set the timezone like this:

tm.replace(tzinfo=pytz.timezone('UTC'))
>>> tm
datetime.datetime(2010, 8, 4, 14, 15, 16, tzinfo=<UTC>)

Eventually, I change the timezone to US/Pacific like this:

>>> tm = tm.astimezone(pytz.timezone('US/Pacific'))
>>> tm
datetime.datetime(2010, 8, 4, 7, 15, 16, tzinfo=<DstTzInfo 'US/Pacific' PDT-1 day, 17:00:00 DST>)

This is correct. But if I were to go into the other direction:

>>> tm = tm.replace(tzinfo =pytz.timezone('US/Pacific'))
>>开发者_开发问答;> tm
datetime.datetime(2010, 8, 4, 14, 15, 16, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>)

As you can see, using replace() with the PST timezone incorrectly assumes it is not daylight savings time. Therefore, when I convert to UTC, it adds 8 hours instead of 7.

Why is it doing this and how do I change it so it does what I want (correctly realize DST or not)?


Yes, this is why you use .astimezone and not .replace when you have a datetime with a timezone. Using .astimezone gives the timezone a chance to adjust for things like daylight savings. Only use .replace to give a naïve datetime a tzinfo object.

0

精彩评论

暂无评论...
验证码 换一张
取 消