Sử dụng timedelta để chuyển đổi giữa các múi giờ. Tất cả những gì bạn cần là sự bù giờ tính theo giờ giữa các múi giờ. Không phải nghịch ngợm với các ranh giới cho tất cả 6 yếu tố của một đối tượng datetime. timedelta xử lý năm nhuận, bước nhảy vọt thế kỷ, vv, quá, dễ dàng. Bạn phải là đầu tiên
from datetime import datetime, timedelta
Sau đó, nếu offset
là đồng bằng múi giờ tính bằng giờ:
timeout = timein + timedelta(hours = offset)
trong đó timein và timeout là các đối tượng datetime. ví dụ
timein + timedelta(hours = -8)
chuyển đổi từ GMT sang PST.
Vậy, làm thế nào để xác định offset
? Đây là một hàm đơn giản với điều kiện bạn chỉ có một vài khả năng chuyển đổi mà không sử dụng các đối tượng datetime là múi giờ "nhận biết" mà một số câu trả lời khác làm tốt. Một chút thủ công, nhưng đôi khi rõ ràng là tốt nhất.
def change_timezone(timein, timezone, timezone_out):
'''
changes timezone between predefined timezone offsets to GMT
timein - datetime object
timezone - 'PST', 'PDT', 'GMT' (can add more as needed)
timezone_out - 'PST', 'PDT', 'GMT' (can add more as needed)
'''
# simple table lookup
tz_offset = {'PST': {'GMT': 8, 'PDT': 1, 'PST': 0}, \
'GMT': {'PST': -8, 'PDT': -7, 'GMT': 0}, \
'PDT': {'GMT': 7, 'PST': -1, 'PDT': 0}}
try:
offset = tz_offset[timezone][timezone_out]
except:
msg = 'Input timezone=' + timezone + ' OR output time zone=' + \
timezone_out + ' not recognized'
raise DateTimeError(msg)
return timein + timedelta(hours = offset)
Sau khi xem xét rất nhiều câu trả lời và chơi xung quanh với mã chặt chẽ nhất mà tôi có thể nghĩ ra (bây giờ), có vẻ như tốt nhất là tất cả các ứng dụng, trong đó thời gian là quan trọng và phải có thời gian hỗn hợp, nên nỗ lực thực sự để tạo ra tất cả các đối tượng thời gian "Nhận thức". Sau đó, có vẻ như câu trả lời đơn giản nhất là:
timeout = timein.astimezone(pytz.timezone("GMT"))
để chuyển đổi sang GMT chẳng hạn. Tất nhiên, để chuyển đổi sang / từ bất kỳ múi giờ nào bạn muốn, cục bộ hoặc nếu không, chỉ cần sử dụng chuỗi múi giờ thích hợp mà pytz hiểu (từ pytz.all_timezones). Thời gian tiết kiệm ánh sáng ban ngày sau đó cũng được tính đến.