当前位置: 首页 > 面试题库 >

django 1.4-无法比较原始偏移和知道偏移的日期时间

辛承
2023-03-14
问题内容

我正在将应用程序从Django 1.2迁移到1.4。

我有一个日常任务对象,其中包含一天中应该完成任务的时间:

class DailyTask(models.Model):
    time = models.TimeField()
    last_completed = models.DateTimeField()
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=1000)
    weekends = models.BooleanField()

    def __unicode__(self):
        return '%s' % (self.name)

    class Meta:
        db_table = u'dailytask'
        ordering = ['name']

为了检查是否仍然需要今天完成一项任务,我有以下代码:

def getDueDailyTasks():
    dueDailyTasks=[]
    now = datetime.datetime.now()
    try:
        dailyTasks = DailyTask.objects.all()
    except dailyTask.DoesNotExist:
        return None
    for dailyTask in dailyTasks:
        timeDue = datetime.datetime(now.year,now.month,now.day,dailyTask.time.hour,dailyTask.time.minute,dailyTask.time.second)
        if timeDue<now and timeDue>dailyTask.last_completed:
            if dailyTask.weekends==False and now.weekday()>4:
                pass
            else:
                dueDailyTasks.append({'id':dailyTask.id,
                            'due':timeDue,
                             'name': dailyTask.name,
                             'description':dailyTask.description})
    return dueDailyTasks

在1.2下可以正常工作,但是在1.4下我会收到错误消息:

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

由于线

if timeDue<now and timeDue>dailyTask.last_completed

并且两个比较子句都会引发此错误。

我尝试通过添加pytz.UTC作为参数来使timeDue时区知道,但这仍然会引发相同的错误。

我已经阅读了一些有关时区的文档,但是对于是否只需要使timeDue时区有所了解,或者是否需要对数据库和现有数据进行根本性的更改感到困惑。


问题答案:

检查详尽的文档以获取详细信息。

通常,用于django.utils.timezone.now设置可感知偏移的当前日期时间

>>> from django.utils import timezone
>>> timezone.now()
datetime.datetime(2012, 5, 18, 13, 0, 49, 803031, tzinfo=<UTC>)

django.utils.timezone.make_aware设置一个可偏移的日期时间

>>> timezone.make_aware(datetime.datetime.now(), timezone.get_default_timezone())
datetime.datetime(2012, 5, 18, 21, 5, 53, 266396, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)

然后,您可以比较没有偏移的两个可感知偏移的日期时间。

此外,您可以通过剥离时区信息将偏移量唤醒的日期时间转换为偏移量原始日期时间,然后可以datetime.datetime.now()在utc下与正常进行比较。

>>> t = timezone.now() # offset-awared datetime
>>> t.astimezone(timezone.utc).replace(tzinfo=None)
datetime.datetime(2012, 5, 18, 13, 11, 30, 705324)

USE_TZTrue“默认情况下”(实际上False是默认情况,但是settings.py通过django-admin.py startproject将其设置为生成的文件True),那么如果您的数据库支持时区感知时间,那么与时间相关的模型字段的值将是时区感知。您可以通过在设置中设置USE_TZ=False(或直接删除USE_TZ=True)来禁用它。



 类似资料:
  • 问题内容: 我正在尝试使用比较运算符将当前日期和时间与模型中指定的日期和时间进行比较: 该脚本错误如下: 这些模型如下所示: 我也有使用区域设置日期和时间的django。 我找不到的是django用于DateTimeField()的格式。天真还是知道?以及如何获取datetime.now()来识别语言环境datetime? 问题答案: 默认情况下,该datetime对象naive位于Python中

  • 提前感谢!

  • 问题内容: 我需要将以下格式的String解析为UTC中的LocalDate(或其他)。问题是以下代码: 输出忽略偏移量。所需的输出是 提前致谢! 问题答案: 最简单的答案是用来表示数据,但是您需要默认时间: 在处理时区时很有用,但是在仅处理偏移量时,它会更简单。 通常,应用程序代码不应包含type的变量。如果您看到了,通常会有更好的方法。

  • 问题内容: 我的日期格式是,它产生日期: 但我需要这样的日期: 什么日期格式将产生带有冒号的偏移量? 问题答案: 您可以使用这种格式 看看该文档以获取更多信息。 PS:- 正如我的朋友 @Thomas所 提到的,这仅适用于 Java 7 及更高版本。

  • 问题内容: 日期格式:“ yyyy-MM-dd’T’HH:mm:ss.SSSZ ” 输入日期:“ 2017-09-18T03:08:20.888 + 0200 ” 问题:我需要从输入的字符串中检索时区偏移量,并在该时区中打印已解析的日期。换句话说,我需要输出与输入相同。 成功解析输入日期并返回对象。众所周知,Date没有时区字段。将解析的日期转换为其时区,默认情况下为系统时区。当我打印此日期时,它

  • 有人能解释一下这里出了什么问题吗。我猜这是有偏移和步幅的东西,但是... 顶点包含位置结构和2个浮点,颜色结构和4个GLubyte和Tex结构和2个浮点。 如果我用这段代码替换它,它工作得很好。