可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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())