Python: 测试字符串是否等于日期时间对象?

Python: Test if string is equal to a datetime object?

我几乎完成了日期修复功能(我在 Python 中的第一个真正的项目!)并且我通过 Whosebug 获得了很多帮助——谢谢!

我现在的问题是测试一个不符合我在程序中声明的条件的变量。这是我正在尝试做的事情:

对于我程序中的日期,我想检查可能输入这些日期的各种方式(例如,01/01/1999、01-01-1999、01-Jan-1999、1/1/1999 , 3-9-1999, "None", 等等)。我无法开始工作的是,如果输入的值是 a) 不是整数(即 1999),b) 不是 datetime.date 格式,或 c) 不是字符串 'None'。在我下面的完整代码示例中,我无法弄清楚如何让 "WORDS" 触发一个异常,该异常表明它不是有效日期。

如果有人有时间,你能不能看看我的代码,看看你是否发现了明显的错误?我在想我可能需要一些东西来比较变量 'date' 和它是否是一个日期时间对象,如果为假,打印出一条消息,表明它不是一个有效的日期,但是多次尝试抓住这个都没有成功。如果有人有建议,或要阅读另一篇文章,或者如果他们能找到类似的问题(我还没有找到),请告诉我。感谢您的宝贵时间!

*另外,如果编码过于冗长,请见谅;第一个定时器!

import datetime
import sys
import re

debug = True
log = sys.stdout

dates = ["WORDS", "4-1-2010", "9/1/1999", "7-9-2000", "01/01/2001", "None", "14-Jun-1905", \
"09/09/2009", 2008, "06-06-2006", 1999, "05-May-2005", "12/31/2010", "09-Jul-1905", "07/09/1905", \
"07-09-1905", "1-Jul-1905", "03-Aug-1935", "3/1/1965", 1900]

def fix_date(date):
    constant = datetime.date(1899, 12, 30)
    if debug : print("Fix date:", date, file=log)
    dt = datetime.datetime.strptime(date, '%d-%b-%Y')
    year = int(dt.year)
    month = int(dt.month)
    day = int(dt.day)
    cleanDate = datetime.date(year, month, day)
    dateYear = cleanDate - constant
    x = int(dateYear.days)
    if x < 1901:
        print("ERROR: Date removed:", date, '\n', file=log)
        return ""
    elif x <= datetime.datetime.now().year:
        print("Date converted:", date, "\b:", dateYear.days, file=log)
        print("Date OK:", dateYear.days, '\n')
        return str(dateYear.days)
    else:
        newdate = datetime.datetime.strftime(cleanDate, '%Y%m%d')
        if debug : print("Date OK:", newdate, '\n', file=log)
        return newdate
    print()

print('\nAll Date Variables:\n')
count = 0

for date in dates:
    count += 1
    print(count, '\b: Original date:', date)
    try:
        if date != datetime.datetime.strptime(date, '%m-%d-%Y'):
            dt = datetime.datetime.strptime(date, '%m-%d-%Y')
            date = datetime.datetime.strptime(date, '%m-%d-%Y').strftime('%d-%b-%Y')
            print("DASH:", date)
            fix_date(date)
    except:
        try:
            if date != datetime.datetime.strptime(date, '%m/%d/%Y'):
                dt = datetime.datetime.strptime(date, '%m/%d/%Y')
                date = datetime.datetime.strptime(date, '%m/%d/%Y').strftime('%d-%b-%Y')
                print("SLASH:", date)
                fix_date(date)
        except:
            try:
                if date != datetime.datetime.strptime(date, '%d-%b-%Y'):
                    dt = datetime.datetime.strptime(date, '%d-%b-%Y')
                    date = datetime.datetime.strptime(date, '%d-%b-%Y').strftime('%d-%b-%Y')
                    print("MEDIUM:", date)
                    fix_date(date)
            except:
                try:
                    if date.strip() == "None":
                        print("NONE:", date)
                        print("DO NOT ENTER A DATE\n")
                except:
                    try:
                        if len(str(date)) == 4:
                            print("INTEGER:", date)
                            print("Date OK:", str(date), '\n')
                    except:
                        print("SOME ERROR OCCURRED")

编辑

我通过稍微修改代码并在最后一个 try/except 块之前的块中制作一个 "else" 语句来让事情正常进行。通过寻找星星的踪迹更容易看到我的编辑:)

...
                try:
                    if date.strip() == "None":
                        print("NONE:", date)
                        print("DO NOT ENTER A DATE\n")
                    else:
                        print("********************INVALID DATE")
...

我发现了一些更好的东西。与其自己尝试所有格式,不如使用 dateutil。一行代码尝试解析日期。

您将需要 dateutil pip 包

import dateutil
from dateutil import parser

dte = dateutil.parser.parse('03-31-1981');
dte = dateutil.parser.parse('03/31/1981');
dte = dateutil.parser.parse('1981-03-31');
dte = dateutil.parser.parse('1981-MAR-31');
print(dte)