2013-10-27 25 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