在Python中,假设我的日期为2016年12月25日。如何在该日期创建中午的时区感知日期时间?
如果它与Django的时区处理兼容,则会获得积分。
答案 0 :(得分:15)
诀窍是首先将combine
天真的时间和日期转变为天真的日期时间。然后可以将这个天真的日期时间转换为有意识的日期时间。
可以使用第三方软件包pytz
(在本例中使用“欧洲/伦敦”时区)进行转换:
import datetime
import pytz
naive_time = datetime.time(0, 30)
date = datetime.date(2016, 12, 25)
naive_datetime = datetime.datetime.combine(date, naive_time)
timezone = pytz.timezone('Europe/London')
aware_datetime = timezone.localize(naive_datetime)
如果你在Django中这样做,并且想要使用当前时区(在Django中配置),你可以通过调用make_aware
替换最后两行:
from django.utils import timezone
aware_datetime = timezone.make_aware(naive_datetime)
答案 1 :(得分:0)
Erik对this question的回答解释了为什么应该在datetime.combine()
之后使用timezone.localize()
。直接在datetime.time实例上设置时区将不考虑日期,这可能会导致错误的结果(由于夏令时甚至历史性转换)。 datetime.combine()
并不那么聪明!
>>> import pytz
>>> import datetime
>>> d = datetime.date(2016, 12, 25)
>>> t = datetime.time(12)
>>> tz = pytz.timezone('US/Pacific')
>>> tz.localize(datetime.datetime.combine(d,t))
datetime.datetime(2016, 12, 25, 12, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>)