web-dev-qa-db-ja.com

pytz-UTCとタイムゾーンを現地時間に変換する

私はUTCタイムゾーンにdatetimeを持っています、例えば:

utc_time = datetime.datetime.utcnow()

そして、pytzタイムゾーンオブジェクト:

tz = timezone('America/St_Johns')

utc_timeを指定されたタイムゾーンに変換する適切な方法は何ですか?

28
Tzach

私はそれを得たと思う:

pytz.utc.localize(utc_time, is_dst=None).astimezone(tz)

この行は、最初にナイーブ(タイムゾーンを認識しない)utc_timedatetimeオブジェクトからタイムゾーン(UTC)を含むdatetimeオブジェクトへ。次に、 astimezone 関数を使用して、要求されたタイムゾーンに従って時間を調整します。

45
Tzach

arrow を使用することをお勧めしますか?質問を理解した場合:

>>> import arrow
>>> utc = arrow.utcnow()
>>> utc
<Arrow [2014-08-12T13:01:28.071624+00:00]>    
>>> local = utc.to("America/St_Johns")
>>> local
<Arrow [2014-08-12T10:31:28.071624-02:30]>

使用することもできます

tz.fromutc(utc_time)
7
xbello

fromutc 関数の正確な目的です:

tz.fromutc(utc_time)

astimezone関数は内部でfromutcを呼び出しますが、最初にUTCに変換しようとしますが、これは必要ありません)

6
user8808265

ツァッハの答えに同意します。 is_dstパラメーターが不要であることを含めたいだけです。

pytz.utc.localize(datetime.utcnow()).astimezone(tz)

そのコードは、現在のUTC時間をタイムゾーン対応の現在の日時に変換します。

以下のコードは、現在のUTC時間を、必ずしも現在ではないタイムゾーン対応の日時に変換します。タイムゾーンはUTC時間値に追加されます。

tz.localize(datetime.utcnow())
6
paolov

別の非常に簡単な方法:

utcnowメソッドはnaiveオブジェクトを返すため、naiveオブジェクトをawareオブジェクトに変換する必要があります。 replaceメソッドを使用すると、naiveオブジェクトをawareオブジェクトに変換できます。次に、astimezoneメソッドを使用して、異なるタイムゾーンで新しいdatetimeオブジェクトを作成できます。

from datetime import datetime
import pytz    
utc_time = datetime.utcnow()
tz = pytz.timezone('America/St_Johns')

utc_time =utc_time.replace(tzinfo=pytz.UTC) #replace method      
st_john_time=utc_time.astimezone(tz)        #astimezone method
print(st_john_time)
1
N Randhawa

以下のサンプルも使用できます。同様のタスクに使用します

tz = pytz.timezone('America/St_Johns')
time_difference=tz.utcoffset(utc_time).total_seconds() #time difference between UTC and local timezones in 5:30:00 format
utc_time = date + timedelta(0,time_difference)

それは高速に動作し、追加のライブラリをインポートする必要はありません。

0
awaik