pytz utc转换

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)

  • @kolypto:显然,tz.normalize()将解决夏时制和tz.localize()没有的其他麻烦问题,如[this](/ sf / ask / 96581831)这样的其他答案中所解释的/#answer-96591211)。 (2认同)
  • @kolypto:有些当地时间不存在,例如,在一些国家(北半球)过渡到夏季时,当地时钟在春季跳跃.`tz.localize()`尊重给定的`d`对象(它不会改变时间,它只会尝试添加一个合适的tzinfo对象),因此调整不存在的时间需要`tz.normalize()`.虽然两次(在调整之前/之后)应该对应于相同的UTC时间,即,如果我们所做的只是将时间转换为UTC,则可能不需要`tz.normalize()`,就像在这种情况下一样. (2认同)

jfs*_*jfs 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)
Run Code Online (Sandbox Code Playgroud)