我正在构建一个系统,让用户输入完整或不完整的日期,然后在数据库中找到与该查询匹配的日期列表。
dateutil
包可以很好地解析字符串本身,但是我也需要特殊性,换句话说:
一旦知道了特异性,我就可以轻松确定上限和下限。如何从日期中解析字符串并同时检索特异性?
编辑:示例输入输出对 dateutil的当前行为是用当前数据填充丢失的数据。因此,如果今天是2018年8月25日,我希望:
(datetime(2019, 7, 26), "daily")
(datetime(2019, 7, 25), "monthly")
(datetime(2019, 8, 25), "yearly")
(datetime(2018, 6, 25), "monthly")
输出的确切格式无关紧要,只要清楚其具体含义是什么即可。我还希望能够解析dateutil解析的所有输入日期格式,并且我并不特别在意datetime是否存在(因为dateutil可以提供给我)。
答案 0 :(得分:2)
我不知道在python中是否有一些模块可以做到这一点。我找不到任何东西。
但是内部dateutil解析器首先调用_parse以获取基本信息,例如日期,月份和年份。然后,它调用_build_naive以使用datetime.datetime.now()填充空白。因此,我们扩展了解析器类以编写所需的函数。
from dateutil.parser._parser import parser
class my_parser(parser):
def __init__(self, info=None):
super(my_parser, self).__init__(info)
def specificity(self, timestr, default=None, ignoretz=False, tzinfos=None, **kwargs):
# Do basic parsing, don't integrate current datetime
res, skipped_tokens = super(my_parser, self)._parse(timestr, default, ignoretz, tzinfos, **kwargs)
if(res==None):
print("dateutil parser couldn't parse the string")
return None
# Get the finest resolution
for attr in ("microsecond", "second", "minute", "hour", "day", "month", "year"):
value = getattr(res, attr)
if(value!=None):
return attr
print("Specificity couldn't be determined")
return None
mp = my_parser()
print(mp.specificity("20/3/2018")) # day
print(mp.specificity("june")) # month
print(mp.specificity("2018")) # year
print(mp.specificity("12 june 12AM")) # hour
print(mp.specificity("12 june 12:00AM")) # minute