pytz utc conversion

匿名 (未验证) 提交于 2019-12-03 01:55:01

问题:

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?

回答1:

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()) 


回答2:

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) 


回答3:

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



回答4:

    import pytz     from django.utils import timezone      tz = pytz.timezone('America/Los_Angeles')     time = tz.normalize(timezone.now()) 


文章来源: pytz utc conversion
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!