django - 时间数据与格式 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'
有任何想法吗?
解决方案
带有世纪的年份(如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
推荐阅读
- mysql - 坚持使用 MYSQL 从一张表获取价值到另一张表
- r - 设置用于在 R 中显示数字的全局格式
- git - 如何使用 git reset 来编辑旧的提交
- java - 我想在 onCreate 期间使子线性布局不可见,然后在点击按钮时使其可见
- python - 为什么我会收到“TypeError: '_gdbm.gdbm' object is not iterable”?
- javascript - 重新加载页面时如何使js计时器不重新启动?
- odoo - Odoo 13:如何解决两个冲突的 odoo 主题?
- c# - 如何修复asp.net中的滑块
- node.js - 在 nodejs 中运行 mocha 测试的问题
- r - 如何在ggplot中创建对应并合并的图例?