datetime - 如何要求2位数的日期和月份?

时间:2017-06-23 23:19:13

标签: python python-2.7 date datetime

我一直在使用datetime模块检查日期,看看它们是mm / dd / yyyy还是mm / dd / yy格式。问题是%d和%m指令不够灵敏,无法检测月份或日期是单个数字,这是我的要求。

datetime.strptime('01/01/2001', '%m/%d/%Y')

就像我想要的那样,但是

datetime.strptime('1/1/2001', '%m/%d/%Y')

还生成一个有效的日期时间,当我真的希望它抛出一个ValueError,除非月份和日期是0填充。有谁知道如何设置日期时间格式所需的精度?这是可能的,还是我应该选择正则表达式?

2 个答案:

答案 0 :(得分:1)

您正在使用的datetime功能并非旨在验证输入,只是将字符串转换为datetime个对象。就datetime而言,你的两个例子都是合法的字符串输入。

如果你想强制用户输入为特定格式,我会使用正则表达式 - 请参阅我的REPL中的这个示例:

>>> import re
>>> pattern = re.compile(r"^[0-9]{2}/[0-9]{2}/[0-9]{4}$")
>>> def valid_datestring(datestring):
...     if pattern.match(datestring):
...         return True
...     return False
...
>>> valid_datestring('1/1/2001')
False
>>> valid_datestring('01/01/2001')
True

如果要定义返回格式化日期或返回valueError的函数,可以执行以下操作:

def format_datestring(datestring):
    if not valid_datestring(datestring):
        raise ValueError('Date input must be in the form dd/mm/yyyy!')
    return datetime.strptime(datestring, '%m/%d/%Y')

答案 1 :(得分:0)

您可以通过重新设置datetime的格式并与原始字符串进行比较来验证字符串是否与格式字符串完全一致:

datetime_ = datetime.strptime(datetime_string, DATETIME_FORMAT)
if datetime_.strftime(DATETIME_FORMAT) != datetime_string:
    [fail]