Gunakan timedelta untuk beralih di antara zona waktu. Yang Anda butuhkan hanyalah offset dalam jam di antara zona waktu. Tidak harus mengutak-atik batas untuk semua 6 elemen dari objek datetime. timedelta menangani tahun kabisat, abad kabisat, dll, juga, dengan mudah. Anda harus terlebih dahulu
from datetime import datetime, timedelta
Maka jika offset
zona waktu delta dalam jam:
timeout = timein + timedelta(hours = offset)
di mana timein dan timeout adalah objek datetime. misalnya
timein + timedelta(hours = -8)
mengkonversi dari GMT ke PST.
Lantas, bagaimana cara menentukannya offset
? Ini adalah fungsi sederhana asalkan Anda hanya memiliki beberapa kemungkinan untuk konversi tanpa menggunakan objek waktu-waktu yang "sadar" zona waktu yang dilakukan dengan baik oleh beberapa jawaban lain. Sedikit manual, tetapi terkadang kejelasan yang terbaik.
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)
Setelah melihat banyak jawaban dan bermain-main dengan kode paling ketat yang dapat saya pikirkan (untuk saat ini) tampaknya yang terbaik bahwa semua aplikasi, di mana waktu adalah penting dan zona waktu campuran harus diperhitungkan, harus melakukan upaya nyata untuk membuat semua objek waktu "sadar". Maka tampaknya jawaban yang paling sederhana adalah:
timeout = timein.astimezone(pytz.timezone("GMT"))
untuk mengkonversi ke GMT misalnya. Tentu saja, untuk mengkonversi ke / dari zona waktu lain yang Anda inginkan, lokal atau sebaliknya, cukup gunakan string zona waktu yang sesuai dengan pytz (dari pytz.all_timezones). Waktu musim panas juga diperhitungkan.