Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

pytz utc conversion

What is the right way to convert a naive time and a tzinfo into an UTC time? Say I have:

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

First way, pytz inspired:

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

Second way, from 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)

Needless to say those two methods produce different results for quite a few timezones.

Question is - what's the right way?

like image 208
Art Avatar asked Aug 31 '09 14:08

Art


People also ask

What is pytz UTC?

The pytz package encourages using UTC for internal timezone representation by including a special UTC implementation based on the standard Python reference implementation in the Python documentation. The UTC timezone unpickles to be the same instance, and pickles to a smaller size than other pytz tzinfo instances.

What is UTC time now in 24 hour format?

UTC time in ISO-8601 is 14:10:11Z.


3 Answers

Your first method seems to be the approved one, and should be DST-aware.

You could shorten it a tiny bit, since pytz.utc = pytz.timezone('UTC'), but you knew that already :)

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())
like image 164
ewall Avatar answered Oct 24 '22 09:10

ewall


What is the right way to convert a naive time and a tzinfo into an utc time?

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)
like image 44
jfs Avatar answered Oct 24 '22 11:10

jfs


Use the first method. There's no reason to reinvent the wheel of timezone conversion

like image 1
Jon W Avatar answered Oct 24 '22 10:10

Jon W