我使用dateutil.parser来解析日期,如果日期不完整,我想抛出异常,即1月1日(缺失年份)或2016年1月(缺失日期)。到目前为止,我有以下
try:
parse(date)
return parse(date).isoformat()
except ValueError:
return 'invalid'
答案 0 :(得分:2)
您可以使用类_parse
的私有方法dateutil.parser.parser
来确定是否已提供日,月和年。由于该方法是私有的,其行为可能会改变,并且通常不建议在生产代码中使用其他类的私有方法,但在这种特殊情况下使用它是最简单和最健壮的方法,因此它可能没问题。
修改后的代码如下:
from dateutil.parser import parser, parse
# Check if passed date is complete and valid
def is_date_complete (date, must_have_attr=("year","month","day")):
parse_res, _ = parser()._parse(date)
# If date is invalid `_parse` returns (None,None)
if parse_res is None:
return False
# For a valid date `_result` object is returned. E.g. _parse("Sep 23") returns (_result(month=9, day=23), None)
for attr in must_have_attr:
if getattr(parse_res,attr) is None:
return False
return True
## your code section
if not is_date_complete(date):
return 'invalid'
else:
return parse(date).isoformat()
这里我们使用_parse
的结果来确定日期是否缺少年,月或日。
答案 1 :(得分:2)
Parse采用默认参数,从中获取未指定的部分。因此,最简单的解决方案(除了使用不同的库)将使用两个不同的默认参数调用该函数。
如果两个调用返回相同的值,则datetime有效,否则使用一些默认值 - 您甚至可以通过这种方式找出未指定的内容。
答案 2 :(得分:0)
解析器使用datetime.today()来填充缺失值。如果您将日期传递给解析的default
参数,则解析将使用该日期作为缺失值。通过传递两个具有不同年份,月份和日期值的默认日期,我们可以比较解析结果并查看它们是否不同。
jan_01_2001 = datetime.datetime.strptime('01/01/01', '%m/%d/%y')
feb_02_2002 = datetime.datetime.strptime('02/02/02', '%m/%d/%y')
complete_date = 'May 4, 2017'
incomplete_date = 'May 4'
print parse(complete_date, default=jan_01_2001) == parse(complete_date, default=feb_02_2002)
# True
print parse(incomplete_date, default=jan_01_2001) == parse(incomplete_date, default=feb_02_2002)
# False