我目前正在开发一个应用程序,其中用户填写表单以提交即将进行的活动(稍后将自动安排,尚未达到此目的)。到目前为止,我一直在使用标准datetime
模块对表单输入进行验证,以检查是否输入了有效的日期时间,例如:
import datetime
import tkinter as tk
from tkinter import messagebox as tkMessageBox
#Loads of tkinter stuff leading to variables year, month, day, hour, minute
try:
start_date_time = datetime.datetime(year,month,day,hour,minute)
except ValueError as inst:
tkMessageBox.showerror("Invalid input",inst)
这非常成功。我现在的问题是我想验证start_date_time
将来是否存在。我希望我能够通过操纵datetime.datetime.min
和datetime.datetime.max
来做到这一点,以便使现有代码验证以确定输入是否在将来(并且在未来不会无理由地,太)。
这就是我试图实现这个目标的方法:
now = datetime.datetime.now()
datetime.datetime.min = now
但这会引发以下TypeError
:
Traceback (most recent call last):
File "J:\COMP4 Project\GUI.py", line 13, in <module>
datetime.datetime.min = now
TypeError: can't set attributes of built-in/extension type 'datetime.datetime'
我的问题是:是否有解决办法,以便可以更改datetime.datetime.min
和datetime.datetime.max
的值,或者我必须编写代码来检查要验证的每个日期时间大于now
?
答案 0 :(得分:2)
除非另有说明,否则无法设置datetime.datetime.min
和datetime.datetime.max
的值,但可以更改datetime.MINYEAR
和datetime.MAXYEAR
,这会影响datetime.datetime.min
}和datetime.datetime.max
。对datetime
个对象进行验证的最佳方法,就是检查活动是在将来考虑到帐户的几个月,几天,几小时和几分钟,在我的情况下是使用一个函数。例如:
def validateFuture(x):
now = datetime.datetime.now()
if x > now:
return True
else:
return False
(其中x是datetime.datetime
对象,例如来自问题的start_date_time)
答案 1 :(得分:2)
你总是可以继承datetime.datetime
并自己实施检查:
import datetime
class MyDatetime(datetime.datetime):
def __init__(self, *args, **kwargs):
super().__init__()
if self < datetime.datetime.now():
raise ValueError("Date must be in the future")
MyDatetime(2017,10,10) # Ok
MyDatetime(2010,10,10) # Not ok
但严重的是,不要这样做。只需在验证函数中检查start_date_time > now
,就像您在自己的答案中所写的一样。