现在设置为 Python 3.4 中的最小日期时间
Set now as minimum datetime in Python 3.4
我目前正在开发一个应用程序,用户可以在其中填写表格以提交即将进行的活动(稍后将自动安排,但尚未完成)。到目前为止,我一直在使用标准 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
?
除非我听说,设置 datetime.datetime.min
和 datetime.datetime.max
的值是不可能的,尽管可以更改 datetime.MINYEAR
和 datetime.MAXYEAR
,这会影响 datetime.datetime.min
和 datetime.datetime.max
。对 datetime
对象进行验证的最佳方法,以便在未来进行检查以检查 activity ,考虑到月、日、小时和分钟,在我的情况下是通过使用一个函数。例如:
def validateFuture(x):
now = datetime.datetime.now()
if x > now:
return True
else:
return False
(其中 x 是一个 datetime.datetime
对象,例如问题中的 start_date_time)
您始终可以子类化 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
。
我目前正在开发一个应用程序,用户可以在其中填写表格以提交即将进行的活动(稍后将自动安排,但尚未完成)。到目前为止,我一直在使用标准 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
?
除非我听说,设置 datetime.datetime.min
和 datetime.datetime.max
的值是不可能的,尽管可以更改 datetime.MINYEAR
和 datetime.MAXYEAR
,这会影响 datetime.datetime.min
和 datetime.datetime.max
。对 datetime
对象进行验证的最佳方法,以便在未来进行检查以检查 activity ,考虑到月、日、小时和分钟,在我的情况下是通过使用一个函数。例如:
def validateFuture(x):
now = datetime.datetime.now()
if x > now:
return True
else:
return False
(其中 x 是一个 datetime.datetime
对象,例如问题中的 start_date_time)
您始终可以子类化 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
。