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

sed*_*nym 7 python django timezone

在Python中,假设我的日期为2016年12月25日.如何在该日期创建一个时区感知日期时间?

如果它与Django的时区处理兼容,则奖励积分.

sed*_*nym 19

在纯Python中,您可以使用第三方包combine并指定时区(在本例中为"Europe/London"):

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) 
Run Code Online (Sandbox Code Playgroud)

如果你在Django中这样做,你可以使用当前时区:

from django.utils import timezone

aware_datetime = timezone.make_aware(naive_datetime)
Run Code Online (Sandbox Code Playgroud)

  • [对具有非固定utc偏移的时区使用`.localize()`方法)(http://stackoverflow.com/a/36462784/4279)。或`django.utils.timezone.make_aware()`。 (2认同)
  • 如[here](/sf/answers/3691385071/)所示,`datetime.combine()`在处理时区时未考虑日期,从而导致错误的结果。正如jfs所说,请改用`timezone.localize()`!更具体地说,请使用不带时区的Combine,然后使用localize。 (2认同)
  • 我应该更加清楚,以防万一有人偶然发现:这个答案不正确。 (2认同)

Nea*_*kli 5

埃里克对此问题的回答解释了为什么您应该使用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>)
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

9259 次

最近记录:

7 年,4 月 前