2013-10-27 45 views
2

我正在实现一个自由​​文本搜索功能。用户可以输入任何关键字,例如一个日期字符串..GAE Python:使用dateutil.parser按日期搜索

我希望它很灵活:“2013年10月”,“2013年10月”,“2013-10”等都应该被认可。并且由于App Engine搜索API仅将日期格式识别为YYYY-MM-DD,如果我收到“2013年10月”,我需要将它翻译为“search_date> = 2013-10-01和search_date < = 2013-10-31” 。

我设法使用dateutil.parser.parse(search_date_str),但问题是如果任何日期组件丢失,它将使用今天的数据。例如“2013年10月”将被解析为“2013-10-27”。在这种情况下,我无法判断用户是否在键入“2013年10月27日”或只是“2013年10月”。如果用户只想搜索“2013”​​,我应该可以将它翻译为[2013-01-01,2013-12-31]而不是“2013-10-27”

我不知道我该怎么做?如果需要任何的正则表达式我想(我在那个真可怜......)

+0

所以我查看了dateutil.parser.parse函数的代码。它实际上将今天设置为默认日期,并且如果它检测到年,月,日,小时,分钟和秒数据,只需使用default.replace()更新search_date ...所以我稍微修改它,如果日分量是被替换,我设置parse_level是“日”,如果不是,然后检查“月”“年”..这不是很好..但至少适用于我.. – xialin

回答

1

看一看内置日期时间模块(http://docs.python.org/2/library/datetime.html),特别是datetime.strptime功能:(http://docs.python.org/2/library/datetime.html#strftime-strptime-behavior)。这使您可以使用各种不同的格式从字符串中创建一个datetime对象。例如,您可以这样做:

theString = "2013-10" 
theDate = datetime.strptime(theString, "%Y-%m") 
theString2 = "2013 Oct" 
theDate2 = datetime.strptime(theString, "%Y %b") 

和各种其他组合。如果你限制允许的输入格式会容易得多,但无论如何这应该会让你的生活更轻松。您不需要编写任何正则表达式,因为datetime模块已经处理了这个表达式。

+0

只有当我检测到格式。而我的瓶颈是如何首先检测格式。如果我知道格式用户键,那么我现在将如何处理它.. – xialin

+0

这就是为什么我建议你限制允许的输入格式。如果你不能这样做,那么你可以使用* strptime *和各种格式字符串来检查各种格式的输入。如果数据与格式字符串不匹配,将引发异常。 –

+0

我在我的问题中留下了一条评论。我修改了一下解析函数,使它不仅返回解析的日期时间,还返回了一个额外的parse_level。在函数内部,我可以告诉字符串在哪个级别被解析。谢谢你的回答。我认为为用户提供灵活性很重要:) – xialin