Art*_*Art 31 python datetime utc pytz
将天真时间tzinfo
转换为UTC时间的正确方法是什么?说我有:
d = datetime(2009, 8, 31, 22, 30, 30)
tz = timezone('US/Pacific')
Run Code Online (Sandbox Code Playgroud)
第一种方式,pytz启发:
d_tz = tz.normalize(tz.localize(d))
utc = pytz.timezone('UTC')
d_utc = d_tz.astimezone(utc)
Run Code Online (Sandbox Code Playgroud)
第二种方式,来自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)
Run Code Online (Sandbox Code Playgroud)
不用说,这两种方法在很多时区产生不同的结果.
问题是 - 什么是正确的方法?
ewa*_*all 27
您的第一种方法似乎是批准的方法,应该是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())
Run Code Online (Sandbox Code Playgroud)
将幼稚时间和 tzinfo 转换为 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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
27639 次 |
最近记录: |