如何在不改变值的情况下使时间对象识别TZ?

时间:2015-09-28 10:46:22

标签: python django pytz

我正在研究django项目,我对时区感到困惑。

我有一个活动对象,它有publish_startpublish_end日期。

来自控制台的示例输出;

campaingObject.publish_start
datetime.datetime(2015, 9, 1, 0, 0)

campaingObject.publish_end
datetime.datetime(2015, 9, 28, 10, 10)

我想要活动现在活跃的对象。这意味着发布开始时间小于当前时间,结束时间大于当前时间。

当我打电话时:

datetime.now()
datetime.datetime(2015, 9, 28, 5, 42, 37, 448415)

此结果不在我的时区。我可以用

获取自己的时间信息
datetime.now(pytz.timezone('Europe/Istanbul'))

但这次我无法比较值以找出现在哪些对象处于活动状态。

datetime.now(pytz.timezone('Europe/Istanbul')) > campaingObject.publish_end
TypeError: can't compare offset-naive and offset-aware datetimes

我如何比较这些时间以找出现在哪些对象处于活动状态?

2 个答案:

答案 0 :(得分:3)

您可以在天真的日期时间对象上使用django中的make_aware函数。然后,您必须指定天真时间戳的时区。

now_ts = datetime.now(pytz.timezone('Europe/Istanbul'))
now_ts > make_aware(campaingObject.publish_end, pytz.timezone('Europe/Istanbul'))

https://docs.djangoproject.com/en/1.8/ref/utils/#django.utils.timezone.make_aware

另一方面,您还可以使用make_naive函数从now()时间戳中删除时区信息:

now_ts = datetime.now(pytz.timezone('Europe/Istanbul'))
now_naive = make_naive(now_ts, pytz.timezone('Europe/Istanbul'))
now_naive > campaingObject.publish_end

https://docs.djangoproject.com/en/1.8/ref/utils/#django.utils.timezone.make_naive

答案 1 :(得分:1)

   datetime.now(pytz.timezone('Europe/Istanbul')) > campaingObject.publish_end
   TypeError: can't compare offset-naive and offset-aware datetimes
     

我如何比较这些时间以找出现在哪些对象处于活动状态?

在任何地方使用时区感知日期时间对象。如果USE_TZ = True则django在内部使用时区感知日期时间对象。特别是,timezone.now()返回一个知道的日期时间对象。

timezone.localtime(timezone.now())返回current time zone - you don't need to call timezone.localtime() explicitly中的当前时间 - 当前时区用于自动呈现。如果默认时区activate('Europe/Istanbul')不适合请求,则可以使用TIME_ZONE更改当前时区。

  

如何在不更改值的情况下使时间对象识别TZ?

如果您已配置USE_TZ=True;你不应该看到天真的日期时间对象。要将current time zone附加到天真的日期时间对象,请致电dt = timezone.make_aware(naive_dt)

通常,您可以直接调用pytz_timezone.localize()方法:

#!/usr/bin/env python
from datetime import datetime
import pytz

tz = pytz.timezone('Europe/Istanbul')
now = datetime.now(tz) # get the current time
then = tz.localize(datetime.strptime('2015-09-15 17:05', '%Y-%m-%d %H:%M'),
                   is_dst=None)

这是more details about what is is_dst flag and why do you need it, see "Can I just always set is_dst=True?" section