Используйте timedelta для переключения между часовыми поясами. Все, что вам нужно, это смещение в часах между часовыми поясами. Не нужно возиться с границами для всех 6 элементов объекта datetime. 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). Летнее время также учитывается.