现在设置为 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.mindatetime.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.mindatetime.datetime.max 的值,或者我必须编写代码来检查每个要验证的日期时间都大于 now?

除非我听说,设置 datetime.datetime.mindatetime.datetime.max 的值是不可能的,尽管可以更改 datetime.MINYEARdatetime.MAXYEAR,这会影响 datetime.datetime.mindatetime.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