42

tzinfoナイーブな時間とを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)

言うまでもなく、これら2つの方法では、かなりの数のタイムゾーンで異なる結果が得られます。

質問は-正しい方法は何ですか?

4

4 に答える 4

34

最初の方法は承認されているようで、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())
于 2009-08-31T16:07:40.727 に答える
7

ナイーブ時間と tzinfo を utc 時間に変換する正しい方法は何ですか?

この回答は、現地時間を 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)
于 2014-10-04T07:25:02.360 に答える
1

最初の方法を使用します。タイムゾーン変換の輪を再発明する理由はありません

于 2009-08-31T15:18:22.760 に答える
-2
    import pytz
    from django.utils import timezone

    tz = pytz.timezone('America/Los_Angeles')
    time = tz.normalize(timezone.now())
于 2015-07-22T21:25:59.770 に答える