Python有很好的日期解析,但是通过今天创建一个新日期并进行减法来识别日期时间的唯一方法,例如"今天下午3:20"或"昨天上午11:06"?
我喜欢的库很多,而且我看到越来越多的人使用的是python-dateutil,但遗憾的是它既不是它也不是其他传统的大日期时间解析器,来自Egenix的mxDateTime可以解析"明天"这个词,尽管这两个库都是拥有非常强大的"模糊"解析器.
我见过的唯一可以做到这一点的库是magicdate.例子:
>>> import magicdate >>> magicdate.magicdate('today') datetime.date(2009, 2, 15) >>> magicdate.magicdate('tomorrow') datetime.date(2009, 2, 16) >>> magicdate.magicdate('yesterday') datetime.date(2009, 2, 14)
不幸的是,这只返回datetime.date对象,因此不包含时间部分,也无法处理"今天下午3:20"的示例.
所以,你需要mxDateTime.例子:
>>> import mx.DateTime >>> mx.DateTime.Parser.DateTimeFromString("Today 3:20 PM")>>> mx.DateTime.Parser.DateTimeFromString("Tomorrow 5:50 PM")
编辑:mxDateTime.Parser只解析这些例子中的时间,忽略单词"今天"和"明天".因此,对于这种特殊情况,您需要使用magicdate的组合来获取日期,并使用mxDateTime来获取时间.我的建议是只使用python-dateutils或mxDateTime,只接受他们可以解析的字符串格式.
编辑2:如评论中所述,它看起来python-dateutil现在可以处理模糊解析.我也发现了为Chandler开发的parsedatetime模块,它可以解决这个问题:
>>> import parsedatetime.parsedatetime as pdt >>> import parsedatetime.parsedatetime_consts as pdc >>> c=pdc.Constants() >>> p=pdt.Calendar(c) >>> p.parse('Today 3:20 PM') ((2010, 3, 12, 15, 20, 0, 4, 71, -1), 3) >>> p.parse('Yesterday 11:06 AM') ((2010, 3, 11, 11, 6, 0, 3, 70, -1), 3)
这里是参考当前时间:
>>> import datetime >>> datetime.datetime.now() datetime.datetime(2010, 3, 12, 15, 23, 35, 951652)