Datetime Timezone conversion using pytz
这只是
有两个函数可以在两个时区之间转换日期时间对象。第二个函数适用于所有情况。第一个函数在两种情况下失败,(3)和(4)。类似的,所以波斯特没有这样的问题。任何基于
1 2 | >>> from dateutil.parser import parse >>> import pytz |
第一功能(Buggy)
下面的函数使用
1 2 3 4 5 6 | 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--好
1 2 | >>> 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--好
1 2 | >>> 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个小时
1 2 | >>> 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个小时。不考虑日光节约。
1 2 | >>> 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>) |
第二功能(完美工作)
下面的函数使用
1 2 3 4 5 | 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) |
(1)从UTC到EST--好
1 2 | >>> 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)从UTC到EDT--好
1 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)从EST到UTC——好的。
1 2 | >>> 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——好。
1 2 | >>> 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>) |
我假设你有以下问题:
- 为什么第一个函数适用于UTC时区?
- 为什么
'US/Eastern' 时区失败(DstTzInfo 实例)? - 为什么第二个函数适用于所有提供的示例?
第一个函数不正确,因为它使用
第二个函数在大多数情况下都是正确的,除了在不明确或不存在的时间(例如,在DST转换期间),您可以通过将
第一个函数适用于UTC时区,因为它对任何日期都具有固定的UTC偏移量(零)。其他时区(如
总结:
原则上,