python - 如何验证字符串是否是 Python 中的有效日期
问题描述
我在 Django 中有一个具有两个DateField的模型,但有时它们会从前端收到错误的日期,例如“20196-10-23”。即使它实际上可能是一个有效的日期(疯狂,但合法),由于这个错误,python 不允许比较两个日期:TypeError: '>=' not supported between instances of 'datetime.date' and 'str'
,所以我想使用clean()
方法来验证两个日期都是有效的,但我总是得到日期错误,即使它们是正确的。
这是clean()
方法的代码:
def clean(self, *args, **kwargs):
try:
Reservation.objects.get(booking=self.booking)
except:
pass
else:
raise CustomValidation(_('Booking already exists.'), 'booking', status_code=status.HTTP_400_BAD_REQUEST)
print("{}/{}".format(self.arrival_date, self.departure_date))
try:
datetime.strptime(self.arrival_date, "%Y-%m-%d")
except:
raise CustomValidation(_('Arrival date must be a valid date.'), 'arrival_date', status_code=status.HTTP_400_BAD_REQUEST)
if self.arrival_date >= self.departure_date:
raise CustomValidation(_('Departure date must be later than Arrival date.'), 'departure_date', status_code=status.HTTP_400_BAD_REQUEST)
elif self.arrival_date <= timezone.datetime.now().date():
if self.id == None:
raise CustomValidation(_('Arrival date must be later than today.'), 'arrival_date', status_code=status.HTTP_400_BAD_REQUEST)
if self.status == 'CONFIRMED' and self.confirmation is None:
raise CustomValidation(_('Must provide a confirmation number.'), 'confirmation', status_code=status.HTTP_400_BAD_REQUEST)
即使日期正确,我总是会遇到异常。
解决方案
虽然 20196 年在概念上是有效的年份,但 Python 不允许这样做。我试过这个...
import datetime
from datetime import date
def clean(arrival_date):
return date(*map(int, arrival_date.split("-")))
print(clean("20196-10-23"))
# ValueError: year is out of range
...并发现 Python 日期实际上有一个硬编码的最大年份值 9999。
因此,虽然您可以通过各种方式在技术上验证格式,但您将无法使用内置datetime
模块处理这样的日期。
推荐阅读
- html - 添加与 html 文件不在同一台计算机上的 img src
- typescript - 将 combineAll 与 2 个可观察对象一起使用时 RxJS 缺失值
- gitlab - 如何仅发送 GitLab 计划管道失败电子邮件?
- javascript - 将附加参数传递给 Node JS 中的下载器助手事件的问题
- c# - 无法将 Nethereum 与 Infura 连接
- c# - 按关键字排序字符串
- node.js - 如何在自定义 URL 上运行 Laravel mix?
- bluetooth - 如何实现两个设备的BLE通信?
- mysql - 如何加快这个“最近的记录”mySQL 查询
- javascript - JSON解析变量结果