2009-10-12 55 views
2

在Java中沒有任何方式可以在未明確定義時猜測日期格式?解析Java中的不明確日期

例如,用戶鍵入11Mar09或11-09-2009或11/09/2009或11-09什麼是解析這個到Date對象的最佳方式,而沒有一堆try catch或引發錯誤?

+3

更重要的是,您將如何知道2009年9月11日或2009年11月9日? – 2009-10-12 04:11:21

+0

謝謝大家的意見,我會強制日期採用特定格式。 – 2009-10-12 06:19:11

回答

5

我的推薦是不要。使用日期選擇器或明確指出的格式。猜測會導致各種各樣的問題,如果日期很關鍵,就很容易包括訴訟。

如果您的猜測,請提供某種形式的非模糊反饋,如確認頁面上寫着「您的航班將於2009年11月9日預訂。這是否正確?」。

2

你可能有一堆正則表達式,並循環直到找到匹配。我想你也可以有一堆DateFormats並循環遍歷它們,在發生故障的地方捕獲異常。

第一種避免在非例外情​​況下使用異常,第二種從設計的角度來看可能更好,因爲您使用日期解析框架來設計它。但總的來說,我認爲任何一種方法本身都不一定是「最好」或「最差」 - 更多的是個人喜好/信念。

1

由於可能的日期字符串的域是無限的,我不知道如何才能識別它們。但是,您可以選擇一個子集進行模式匹配。

你沒有提供關於你的用戶界面的線索,但這裏最好的方法是幫助用戶輸入日期。例如使用彈出式日曆或僅強制使用預定義的格式。

7

我不認爲你要做到這一點,特別是基於你的例子,但如果你一定要,我覺得你最好的選擇將是使用類似Apache的DateUtils公地郎鹹平:

String[] datePatterns = new String[] { 
    "ddMMMyy", // ex. 11Mar09 
    "dd-MM-yyyy", // ex. 11-09-2009 
    "dd/MM/yyyy", // ex. 11/09/2009 
    "dd-MM"  // ex. 11-09 
} 

Date date = DateUtils.parseDate(stringDate, datePatterns); 

像上面第四個不幸的日期會有問題 - 是「11/09」9月11日,11月9日,2011年9月,2009年11月,還是別的?