这只是关于pytz
的另一篇文章。
有两个函数可将日期时间对象在两个时区之间转换。第二个函数适用于所有情况。第一个函数在两种情况(3和4)下会失败。类似的SO帖子没有这样的问题。基于localize(datetime.datetime)
和replace(tzinfo)
之间差异的任何解释都将提供巨大的帮助。
>>> from dateutil.parser import parse
>>> import pytz
第一个函数(有错误)
下面的函数使用了datetime.datetime.replace(tzinfo)
。
def buggy_timezone_converter(input_dt, current_tz='UTC', target_tz='US/Eastern'):
'''input_dt is a datetime.datetime object'''
current_tz = pytz.timezone(current_tz)
target_tz = pytz.timezone(target_tz)
target_dt = input_dt.replace(tzinfo=current_tz).astimezone(target_tz)
return target_tz.normalize(target_dt)
注意现在有四个日期时间转换。
(1) 从UTC到EST -- 正常
>>> buggy_timezone_converter(parse('2013-02-26T04:00:00'))
Out[608]: datetime.datetime(2013, 2, 25, 23, 0, tzinfo=<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>)
(2) 从UTC到EDT -- 可行
>>> buggy_timezone_converter(parse('2013-05-26T04:00:00'))
Out[609]: datetime.datetime(2013, 5, 26, 0, 0, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)
(3) 从东部夏令时(EST)到世界标准时间(UTC)-- 不正确。时间偏移为4小时56分钟,应该是5小时。
>>> buggy_timezone_converter(parse('2013-02-26T04:00:00'), target_tz='UTC', current_tz='US/Eastern')
Out[610]: datetime.datetime(2013, 2, 26, 8, 56, tzinfo=<UTC>)
(4) 从EDT到UTC -- 不正确。时间偏移量为4小时56分钟,应该是4小时。不考虑夏令时。
>>> buggy_timezone_converter(parse('2013-05-26T04:00:00'), current_tz='US/Eastern', target_tz='UTC')
Out[611]: datetime.datetime(2013, 5, 26, 8, 56, tzinfo=<UTC>)
第二个函数(完美工作)
以下函数使用pytz.timezone.localize(datetime.datetime)
,它能够完美工作。
def good_timezone_converter(input_dt, current_tz='UTC', target_tz='US/Eastern'):
current_tz = pytz.timezone(current_tz)
target_tz = pytz.timezone(target_tz)
target_dt = current_tz.localize(input_dt).astimezone(target_tz)
return target_tz.normalize(target_dt)
从UTC转换为EST - 成功
>>> good_timezone_converter(parse('2013-02-26T04:00:00'))
Out[618]: datetime.datetime(2013, 2, 25, 23, 0, tzinfo=<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>)
(2)从协调世界时到东部夏令时--可以
>>> good_timezone_converter(parse('2013-05-26T04:00:00'))
Out[619]: datetime.datetime(2013, 5, 26, 0, 0, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)
(3) 从东部标准时间到协调世界时 -- 可以。
>>> good_timezone_converter(parse('2013-02-26T04:00:00'), current_tz='US/Eastern', target_tz='UTC')
Out[621]: datetime.datetime(2013, 2, 26, 9, 0, tzinfo=<UTC>)
(4) 从EDT到UTC -- OK。
>>> good_timezone_converter(parse('2013-05-26T04:00:00'), current_tz='US/Eastern', target_tz='UTC')
Out[620]: datetime.datetime(2013, 5, 26, 8, 0, tzinfo=<UTC>)
>>> timezone_converter(datetime.datetime(2013,02,26,4,0,0,0), target_tz='UTC', current_tz='US/Eastern')
datetime.datetime(2013年2月26日9时0分,tzinfo=<UTC>)
- Mark Ransomconvert_tz_replace()
和convert_tz()
。 - jfspytz
)。timezone_converter_replace(datetime(2013,2,26,4,0,0,0), target_tz='UTC', current_tz='US/Eastern')
->datetime.datetime(2013, 2, 26, 8, 56, tzinfo=<UTC>)
,即.replace()
无法正常工作,如文档所述。 - jfs