我正在研究django项目,我对时区感到困惑。
我有一个活动对象,它有publish_start
和publish_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
我如何比较这些时间以找出现在哪些对象处于活动状态?
答案 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)