解析日期并使用Python获取特异性

时间:2018-08-24 04:24:40

标签: python datetime

我正在构建一个系统,让用户输入完整或不完整的日期,然后在数据库中找到与该查询匹配的日期列表。

dateutil包可以很好地解析字符串本身,但是我也需要特殊性,换句话说:

  • “ 20/3/2018”解析,并且特定于一天
  • “ 6月”解析(如果今天是2018年8月20日,则解析为2018-06-20,因为它使用的是今天的日期),但特定于 month ,即我希望有任何行在六月的数据库中匹配
  • 2018年解析,并且特定于年份

一旦知道了特异性,我就可以轻松确定上限和下限。如何从日期中解析字符串并同时检索特异性?

编辑:示例输入输出对 dateutil的当前行为是用当前数据填充丢失的数据。因此,如果今天是2018年8月25日,我希望:

  • 输入->输出
  • “ 2019-07-26”-> (datetime(2019, 7, 26), "daily")
  • “ 2019-07”-> (datetime(2019, 7, 25), "monthly")
  • “ 2019”-> (datetime(2019, 8, 25), "yearly")
  • “六月”-> (datetime(2018, 6, 25), "monthly")

输出的确切格式无关紧要,只要清楚其具体含义是什么即可。我还希望能够解析dateutil解析的所有输入日期格式,并且我并不特别在意datetime是否存在(因为dateutil可以提供给我)。

1 个答案:

答案 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