2009-08-31 9 views
26

ナイーブタイムとtzinfoをUTC時間に変換する正しい方法は何ですか? は、私が持っていると言う:pytz utc変換

d = datetime(2009, 8, 31, 22, 30, 30) 
tz = timezone('US/Pacific') 

まず道、pytz触発:

d_tz = tz.normalize(tz.localize(d)) 
utc = pytz.timezone('UTC') 
d_utc = d_tz.astimezone(utc) 

第二の方法は、これらの2つの方法がかなりの数のために異なる結果をもたらすことは言うまでもない

UTCDateTimeField

def utc_from_localtime(dt, tz): 
    dt = dt.replace(tzinfo=tz) 
    _dt = tz.normalize(dt) 
    if dt.tzinfo != _dt.tzinfo: 
     # Houston, we have a problem... 
     # find out which one has a dst offset 
     if _dt.tzinfo.dst(_dt): 
      _dt -= _dt.tzinfo.dst(_dt) 
     else: 
      _dt += dt.tzinfo.dst(dt) 
    return _dt.astimezone(pytz.utc) 
から時間帯。

質問は正しいですか?

+0

私は誰も疑問の身体から '感謝' を削除しないことを驚いています。それを取り除くのにどれくらいの時間がかかるか見てみましょう! – Art

+0

私の計算では、わ​​ずか897日間です。 – Will

+0

ありがとう、ウィル、間違ったことを正当化するため! – Art

答えて

19

最初の方法は承認されたものと思われ、DST対応である必要があります。

あなたはpytz.utc = pytz.timezone( 'UTC')いるので、それをほんの少しを短縮することができますが、あなたはそのすでに:)

tz = timezone('US/Pacific') 
def toUTC(d): 
    return tz.normalize(tz.localize(d)).astimezone(pytz.utc) 

print "Test: ", datetime.datetime.utcnow(), " = ", toUTC(datetime.datetime.now()) 
+0

なぜnormalize()ですか?それは本当に必要ですか? – kolypto

+1

@kolypto:明らかに、 'tz.normalize()'は、[this one](https:// stackoverflow)のような他の答えで説明されているように、 'tz.localize()'がしない夏時間とその他の不都合を考慮します。 .com/a/1379874/147320)。 – ewall

+2

@kolypto:一部の国(北半球)の夏時間に移行中に、ローカルクロックが春に前方にジャンプするなど、いくつかの現地時間が存在しません。 'tz.localize()'は指定された 'd'オブジェクトを尊重します(時間は変更されず、適切なtzinfoオブジェクトを追加するだけです)ので、存在しない時刻を調整するには' tz.normalize() 'が必要です。両方の時間(調整前後)は同じUTC時間に対応する必要があります。つまり、この場合のように時間をUTCに変換する場合は、 'tz.normalize()は不要です。 – jfs

0

最初の方法を使用してください。タイムゾーン変換のホイールを再構築する理由はありません

3

への正しい方法は何を知っていましたナイーブな時間とtzinfoをutcの時間に変換しますか?

This answer enumerates some issues with converting a local time to UTC

from datetime import datetime 
import pytz # $ pip install pytz 

d = datetime(2009, 8, 31, 22, 30, 30) 
tz = pytz.timezone('US/Pacific') 

# a) raise exception for non-existent or ambiguous times 
aware_d = tz.localize(d, is_dst=None) 
## b) assume standard time, adjust non-existent times 
#aware_d = tz.normalize(tz.localize(d, is_dst=False)) 
## c) assume DST is in effect, adjust non-existent times 
#aware_d = tz.normalize(tz.localize(naive_d, is_dst=True)) 

# convert to UTC 
utc_d = aware_d.astimezone(pytz.utc) 
-2
import pytz 
    from django.utils import timezone 

    tz = pytz.timezone('America/Los_Angeles') 
    time = tz.normalize(timezone.now()) 
+0

それは間違っています。 'USE_TZ = True'の場合、' timezone.now() 'はUTCで認識日時を返しますので、' tz.normalize() 'を呼び出すべきではありません。 'USE_TZ = False'ならば、djangoはAmerica/Los_Angelesと異なるかもしれないデフォルトタイムゾーンを使います。この場合もコードは間違っています。 – jfs

関連する問題