2015-09-28 83 views
2

我正在做一个django项目,我对时区感到困惑。如何在不更改值的情况下使时间对象TZ感知?

我有一个竞选对象,它有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 

我该如何比较这个时间来查找哪些对象现在处于活动状态?

回答

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_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
datetime.now(pytz.timezone('Europe/Istanbul')) > campaingObject.publish_end 
    TypeError: can't compare offset-naive and offset-aware datetimes 

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

无处不在使用时区感知的datetime对象。如果USE_TZ = True,则django在内部使用可识别时区的日期时间对象。特别是,timezone.now()返回一个知晓的日期时间对象。

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

如何在不更改值的情况下使时间对象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

相关问题