我试图理解为什么在将时区转换为UTC时我得到这些结果:
In [74]: d1 = datetime(2007, 12, 5, 6, 30,tzinfo=pytz.timezone('US/Pacific'))
In [75]: d1
Out[75]: datetime.datetime(2007, 12, 5, 6, 30, tzinfo=<DstTzInfo 'US/Pacific' LMT-1 day, **16:07:00 STD**>)
In [76]: d1.astimezone(pytz.utc)
Out[76]: datetime.datetime(2007, 12, 5, 14, 23, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud)
为什么早上6:30成为下午2:23?
另一方面,如果我使用以下方法,我得到预期的结果:
In [90]: d2 = datetime(2007, 12, 5, 6, 30)
In [91]: uspac = pytz.timezone('US/Pacific')
In [92]: d2_aware = uspac.localize(d2)
In [94]: d2_aware.astimezone(pytz.utc)
Out[94]: datetime.datetime(2007, 12, 5, 14, 30, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud)
Ken*_*ial 42
我得到的只是一种解决方法,简单的规则是使用datetime()从不使用时区信息创建日期时间.
这个样本会给你一个暗示.如你所见,你可以避免出现意想不到的差异,只有你做了"天真"的日期时间(它是没有时区信息的日期时间)然后本地化它(虽然你在UTC上创建日期时不应用它):
import pytz
from datetime import datetime
# make Jan 1 on PDT -> UTC
pdt = pytz.timezone("America/Los_Angeles")
pdtnow1 = datetime(2014,1,1, tzinfo=pdt)
pdtnow2 = pdt.localize(datetime(2014,1,1))
pytz.utc.normalize(pdtnow1)
# > datetime.datetime(2014, 1, 1, 7, 53, tzinfo=<UTC>)
pytz.utc.normalize(pdtnow2)
# > datetime.datetime(2014, 1, 1, 8, 0, tzinfo=<UTC>)
# make Jan 1 on UTC -> PDT
utcnow1 = datetime(2014,1,1, tzinfo=pytz.utc)
utcnow2 = pytz.utc.localize(datetime(2014,1,1))
pdt.normalize(utcnow1)
# > datetime.datetime(2013, 12, 31, 16, 0,
# > tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)
pdt.normalize(utcnow2)
# > datetime.datetime(2013, 12, 31, 16, 0,
# > tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)
Run Code Online (Sandbox Code Playgroud)
小智 27
从部分文档:http: //pytz.sourceforge.net/#localized-times-and-date-arithmetic
不幸的是,对于许多时区,使用标准日期时间构造函数的'tzinfo参数''与pytz不兼容.[...]对于没有夏令时转换的时区,例如UTC,这是安全的.[...]处理时间的首选方法是始终使用UTC,仅在生成输出以供人类阅读时转换为本地时间.
不幸的是,使用此方法创建时区感知日期不起作用。
如果您使用的是 Django,它们有一个实用函数make_aware,可以正确执行此操作。
from django.utils.timezone import make_aware
from pytz import timezone
unaware_datetime = datetime(2007, 12, 5)
local_datetime = make_aware(datetime(2007, 12, 5))
specific_datetime = make_aware(datetime(2007, 12, 5), timezone("Australia/Melbourne"))
Run Code Online (Sandbox Code Playgroud)
如果你没有使用 Django,那么make_aware 函数的源代码可能会给你灵感。
| 归档时间: |
|
| 查看次数: |
8704 次 |
| 最近记录: |