2011-06-25 59 views
0

對於我正在處理的項目,我需要將字符串轉換爲日期。不幸的是,所有需要轉換的字符串的日期和時間格式不相同。在當前值中,我們經常看到類似於2011-06-25T22:44:122011-06-25 22:49:01(注意T?)。字符串到日期;輸入格式變化

我知道如何將一個字符串轉換使用SimpleDateFormat的一個日期,但因爲我不知道是什麼格式的輸入都會有這個似乎不是正確的方法。我想知道是否有一種方法可以添加幾個'格式'到一個DateFormat對象或可能有 DateFormat類可以自動檢測格式?

另一種方法我想的是用一些,如果在字符串/else語句和正則表達式來找出正在使用什麼格式,並使用與之相匹配的的SimpleDateFormat類,但我很確定應該有一個更簡單的方法。有什麼建議麼?

回答

0

如果你有幾個變種,不只是一個'T',另一個具有空格,我相信if/then/else與幾個正則表達式和匹配的SimpleDateFormats是要走的路。

+0

我正在考慮這種方法,但是當有很多變體(我真的很不喜歡寫正則表達式)時,它看起來像很多工作。也許我可以迭代_SimpleDateFormat_對象的_List_,嘗試解析字符串,如果成功,則打破循環。但我希望有更好的方法。 –

0

測試'T'是否存在,解析字符串並用空格替換。現在你可以使用Date Formatter創建一個Date對象。

+0

給定的格式只是幾種可能格式中的兩種,所以恐怕這不是解決問題的最佳方案。 –

1

T裏面的是因爲它是日期http://en.wikipedia.org/wiki/ISO_8601的標準ISO格式。不過請注意,帶有'T'的這種格式只是日期到來時可能會看到的幾種變體之一,ISO 8601(其中一種變體被剝離時間,另一種變體是隨後的時區特定化)。

如果你知道你的日期將符合ISO 8601標準(這是很經常的良好的規範XML - 當您使用XSD日期字段符合ISO 8601),那麼Java的SimpleDateFormat的是不夠的 - 實在是太簡單......你可能會恢復到JodaTime庫,而不是 - 喬達時間已ISO 8601格式供您使用: http://joda-time.sourceforge.net/api-release/org/joda/time/format/ISODateTimeFormat.html

編輯:我不會實現任何複雜的正則表達式匹配 - 這使得代碼難以維護和理解從長遠來看(特別是如果你可以有很多格式的源)

建議是 - 找出哪個提供商使用w這種格式和應用策略模式:formatter = DateFormatterStrategyChooser.getFormatter(String source)。除以等。

如果您不是100%確定哪個源會帶來什麼樣的日期 - 您仍然可以使用UmbrellaFormatter(Collection)並依次遍歷每個格式化程序,直到成功完成爲止。這對於可維護性而非依賴模糊和複雜的規則。

+0

JodaTime庫看起來像一個很好的庫,但不幸的是我不能確定輸入將始終符合ISO8601標準。我正在處理的文件由各方提供,不幸的是,我們偶爾會看到不同的格式。這就是爲什麼我認爲使用可能格式列表的方法將是最簡單的。 –

+2

當然。然後,你真的必須建立一組解析器並逐個解析它們,直到成功(我會構建UmbrellaParser在構建時傳遞一組解析器,然後逐個解析器直到一個成功)。只希望你不會從兩個不同的地方得到YYYY-MM-DD和YYYY-DD-MM。它們有時難以區分。另一個(更好的)選項是找出哪個提供者使用哪種格式和使用策略模式:formatter = DateFormatterStrategyChooser.getFormatter(String source) –

+0

感謝您的信息,我想我會用UmbrellaParser方法。 –