现在设置为Python 3.4中的最小日期时间

时间:2016-01-17 13:07:28

标签: python datetime tkinter python-datetime

我目前正在开发一个应用程序,其中用户填写表单以提交即将进行的活动(稍后将自动安排,尚未达到此目的)。到目前为止,我一直在使用标准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

2 个答案:

答案 0 :(得分:2)

除非另有说明,否则无法设置datetime.datetime.mindatetime.datetime.max的值,但可以更改datetime.MINYEARdatetime.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,就像您在自己的答案中所写的一样。