首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法比较naive和aware datetime.now() <= challenge.datetime_end

无法比较naive和aware datetime.now() <= challenge.datetime_end
EN

Stack Overflow用户
提问于 2013-03-09 13:38:56
回答 7查看 247.5K关注 0票数 233

我尝试使用比较运算符将当前日期和时间与模型中指定的日期和时间进行比较:

if challenge.datetime_start <= datetime.now() <= challenge.datetime_end:

脚本错误输出为:

TypeError: can't compare offset-naive and offset-aware datetimes

模型如下所示:

class Fundraising_Challenge(models.Model):
    name = models.CharField(max_length=100)
    datetime_start = models.DateTimeField()
    datetime_end = models.DateTimeField()

我也有使用地区日期和时间的django。

我找不到的是django用于DateTimeField()的格式。它是天真的还是有意识的?如何让datetime.now()识别区域设置日期时间?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-03-09 13:54:16

默认情况下,datetime对象在Python语言中为naive,因此您需要将这两个对象都设置为朴素的或有意识的datetime对象。这可以使用以下命令来完成:

import datetime
import pytz

utc=pytz.UTC

challenge.datetime_start = utc.localize(challenge.datetime_start) 
challenge.datetime_end = utc.localize(challenge.datetime_end) 
# now both the datetime objects are aware, and you can compare them

注意:如果已经设置了tzinfo,这将引发一个ValueError。如果您不确定这一点,只需使用

start_time = challenge.datetime_start.replace(tzinfo=utc)
end_time = challenge.datetime_end.replace(tzinfo=utc)

顺便说一句,您可以使用时区信息格式化datetime.datetime对象中的UNIX时间戳,如下所示

d = datetime.datetime.utcfromtimestamp(int(unix_timestamp))
d_with_tz = datetime.datetime(
    year=d.year,
    month=d.month,
    day=d.day,
    hour=d.hour,
    minute=d.minute,
    second=d.second,
    tzinfo=pytz.UTC)
票数 216
EN

Stack Overflow用户

发布于 2013-03-09 17:59:54

datetime.datetime.now不支持时区。

Django附带了一个帮助器,它需要pytz

from django.utils import timezone
now = timezone.now()

您应该能够将nowchallenge.datetime_start进行比较

票数 128
EN

Stack Overflow用户

发布于 2019-08-01 18:02:02

它正在从我身上发挥作用。在这里,我创建了表datetime,并在datetime上添加了10分钟。稍后,根据当前时间,执行过期操作。

from datetime import datetime, time, timedelta
import pytz

在数据库日期时间上增加了10分钟

table_datetime = '2019-06-13 07:49:02.832969‘(示例)

# Added 10 minutes on database datetime
# table_datetime = '2019-06-13 07:49:02.832969' (example)

table_expire_datetime = table_datetime + timedelta(minutes=10 )

# Current datetime
current_datetime = datetime.now()


# replace the timezone in both time
expired_on = table_expire_datetime.replace(tzinfo=utc)
checked_on = current_datetime.replace(tzinfo=utc)


if expired_on < checked_on:
    print("Time Crossed)
else:
    print("Time not crossed ")

这对我很管用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15307623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档