datetime在未指定一个时输入值

时间:2017-06-30 17:42:06

标签: python validation datetime

我目前正在学习Python并自己学习一些数据验证。我坚持的一个部分是日期和时间验证。此计划采用了许多参数,包括date_starttime_startdate_endtime_end。问题是我需要ISO格式。一旦采用这种格式,我需要确保它们有效。这就是我被困的地方。

from datetime import datetime

def validate_date(date_start, time_start, date_end, time_end):
    full_date_start = date_start + time_start
    full_date_end   = date_end + time_end

    try:
        formatted_time_start = datetime.strptime(full_date_start, "%Y-%m-%d%H:%M:%S").isoformat(sep="T", timespec="seconds")    
        formatted_time_end = datetime.strptime(full_date_end, "%Y-%m-%d%H:%M:%S").isoformat(sep="T", timespec="seconds")
        return True
    except ValueError:
        return False

date_start = "2017-06-29"
time_start = "16:24:00"
date_end   = "2017-06-"
time_end   = "16:50:30"

print(validate_date(date_start, time_start, date_end, time_end))
print("Date Start: " + date_start + "\nTime Start: " + time_start + "\nDate End: " + date_end + "\nTime End: " + time_end)

我正在测试一些代码,删除date_end的日期,我得到的输出是

2017-06-01T06:50:30

此检查应该失败,或者我认为它应该有,因为没有提供一天。任何帮助将不胜感激,如果有更简单的方法,我会接受它。谢谢!

1 个答案:

答案 0 :(得分:4)

如果在执行失败的行之前检查full_date_end的值,则会得到:"2017-06-16:50:30",因为您要查找的格式如下所示"%Y-%m-%d%H:%M:%S"将第一个数字16作为日期值,将第二个数字作为小时值。

为避免这种情况,我建议使用以下格式:"%Y-%m-%d %H:%M:%S"作为strptime调用的第二个参数。但是,您还需要更改定义full_date_start和full_date_end的行:

full_date_start = date_start + ' ' + time_start
full_date_end = date_end + ' ' + time_end

try:
    formatted_time_start = datetime.strptime(full_date_start, "%Y-%m-%d %H:%M:%S").isoformat(sep="T", timespec="seconds")    
    formatted_time_end = datetime.strptime(full_date_end, "%Y-%m-%d %H:%M:%S").isoformat(sep="T", timespec="seconds")
    ...

我希望能解决你的问题。