タイムゾーンを切り替えるには、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から)。その後、夏時間も考慮されます。