Đây chỉ là một bài đăng khác trên pytz
.Chuyển đổi múi giờ theo thời gian bằng pytz
Có hai chức năng để chuyển đổi đối tượng ngày giờ giữa hai múi giờ. Các hàm thứ hai hoạt động cho tất cả các trường hợp. Hàm đầu tiên thất bại trong hai trường hợp, (3) và (4). Tương tự SO post không có vấn đề như thế này. Bất kỳ giải thích nào dựa trên sự khác biệt giữa localize(datetime.datetime)
và replace(tzinfo)
sẽ là một trợ giúp tuyệt vời.
>>> from dateutil.parser import parse
>>> import pytz
chức năng đầu tiên (buggy)
Hàm dưới đây sử dụng 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)
Lưu ý bốn chuyển đổi giờ hiện tại.
(1) từ UTC để EST - OK
>>> 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) từ UTC để EDT - OK
>>> 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) từ EST để tính theo giờ UTC - Không OK. Thời gian bù đắp là 4 giờ 56 phút. Nó được cho là 5 giờ
>>> 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) từ EDT đến UTC - Không OK. Thời gian bù đắp là 4 giờ 56 phút. Nó được cho là 4 giờ. Tiết kiệm ánh sáng ban ngày không được xem xét.
>>> 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>)
chức năng thứ hai (Tác phẩm hoàn hảo)
Hàm dưới đây sử dụng pytz.timezone.localize(datetime.datetime)
. Nó hoạt động một cách hoàn hảo
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) từ UTC để EST - OK
>>> 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) từ UTC để EDT - OK
>>> 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) từ EST để UTC - OK.
>>> 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) từ EDT đến 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>)
Không thể sao chép: '>>> 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 =) ' –
Xin lỗi, quên thêm các dòng nhập >>> từ phân tích nhập dateutil.parser >>> nhập pytz –
Hoặc câu hỏi của bạn là bản sao của [pytz localize vs datetime replace] (http://stackoverflow.com/q/1379740/4279) hoặc bạn nên hỏi một câu hỏi cụ thể hơn ([cập nhật câu hỏi hiện tại] (http://stackoverflow.com/posts/ 27531718/chỉnh sửa)) nếu bạn không hài lòng với câu trả lời hiện có. Vui lòng sử dụng các tên khác nhau cho hàm đầu tiên và hàm thứ hai, ví dụ: 'convert_tz_replace()' và 'convert_tz()'. – jfs