首页 > 解决方案 > 时间数据与格式 YYYY-MM-DD 不匹配

问题描述

我在获取 python 中 2 个日期之间的天数差异时遇到问题。

我有以下代码块:

    last_used = models.DateTimeField(default=datetime.now().date(), editable=False)
    date_format = "%y-%m-%d"
    a = datetime.strptime(str(datetime.now().date()), date_format)
    b = datetime.strptime(str(last_used), date_format)
    days_since_use = models.IntegerField(default=(b-a).days, editable=False)

我已经尝试过 %y-%m-%d 和 YYYY-MM-DD 格式,但都没有成功。

ValueError: time data '2018-09-16' does not match format '%y-%m-%d'

有任何想法吗?

标签: djangodjango-rest-framework

解决方案


带有世纪的年份(如2018,不是)在每个文档18中用%Y(所以大写Y)表示。

因此格式为:

%Y-%m-%d

使用这种格式,datetime.strptime函数会产生以下结果:

>>> datetime.strptime('2018-09-16', '%y-%m-%d')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/_strptime.py", line 565, in _strptime_datetime
    tt, fraction = _strptime(data_string, format)
  File "/usr/lib/python3.6/_strptime.py", line 362, in _strptime
    (data_string, format))
ValueError: time data '2018-09-16' does not match format '%y-%m-%d'
>>> datetime.strptime('2018-09-16', '%Y-%m-%d')
datetime.datetime(2018, 9, 16, 0, 0)

至于ValueError(见评论部分)。这源于您在类级别进行命令式编程的事实,这首先是一个巨大的“代码气味”(不要这样做,除非您例如想将可变数量的方法附加到一个类,甚至那么它真的很糟糕)。命令式代码只会在类级别执行一次:定义类时,因此对于 Django,这意味着加载服务器时。

如果您需要将天数编码到模型中,可以将其添加到.save()函数中:

class SomeModel(models.Model):
    last_used = models.DateTimeField(default=datetime.now().date(), editable=False)
    days_since_use = models.IntegerField(default=0, editable=False)
    def save(self, *args, **kwargs):
        self.days_since_use = (self.last_used.date() - datetime.now().date()).days
        super(SomeModel, self).save(*args, **kwargs)

请注意,.save(..)但是可以绕过。此外,该字段并不总是包含自该特定日期以来的天数,而仅包含days_since_use保存时间和上次保存时间之间的天数。如果您想计算某事发生后的天数,最好使用属性:

代码>类 SomeModel(models.Model):
    last_used = models.DateTimeField(default=datetime.now().date(), editable=False)

    @财产
    def days_since_use(self):
        返回 (self.last_used.date() - datetime.now().date()).days

推荐阅读