在python中,如何从日期和时间创建一个时区感知的日期时间?

2024-04-26 07:19:09 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,假设我的日期是2016年12月25日。如何在该日期创建一个支持时区的日期时间中午?

如果与Django的时区处理兼容,则可获得额外积分。


Tags: django时间
2条回答

埃里克对this question的回答解释了为什么应该使用datetime.combine(),然后使用timezone.localize()。直接在date time.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>)

诀窍是首先将原始时间和日期转换为原始日期时间。然后可以将此原始日期时间转换为感知日期时间。

转换可以使用第三方包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)

相关问题 更多 >