Використовуйте timedelta для перемикання між часовими поясами. Все, що вам потрібно, це зміщення в години між часовими поясами. Не потрібно возитися з межами для всіх 6 елементів об’єкта дати. timedelta обробляє високосні роки, високосні століття тощо, теж легко. Ви повинні спочатку
from datetime import datetime, timedelta
Тоді якщо offset
дельта дельта часового поясу в годинах:
timeout = timein + timedelta(hours = offset)
де timein та timeout є об'єктами datetime. напр
timein + timedelta(hours = -8)
перетворює з GMT в PST.
Отже, як визначити offset
? Ось проста функція, за умови, що у вас є лише декілька можливостей для перетворення без використання об'єктів дати, які «знають» часовий пояс, що деякі інші відповіді чудово роблять. Трохи посібник, але іноді найкраще чіткість.
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)
Переглянувши численні відповіді та розібравшись із найточнішим кодом, про який я можу придумати (зараз), здається, найкраще, що всі програми, де важливий час та змішані часові пояси, повинні докладати реальних зусиль, щоб зробити усі об’єкти дати "обізнаний". Тоді, здавалося б, найпростіша відповідь:
timeout = timein.astimezone(pytz.timezone("GMT"))
наприклад, перетворити в GMT. Звичайно, для перетворення в / з будь-якого іншого бажаного часового поясу, локального чи іншого, просто використовуйте відповідний рядок часового поясу, який розуміє pytz (з pytz.all_timezones). Тоді також враховується літній час.