2013-06-26 43 views
0

最近在Apache POI庫升級之後,我升級了其他一些API。我使用的另一個庫以字符串形式讀取所有單元格內容,然後我必須將此字符串解析爲Date。兩個字母的年份,應該允許嗎?

當用戶開始輸入日期爲dd-mm-yy時,出現問題,年份顯示爲00yy AD。

爲每SimpleDateFormat

對於解析文檔,如果模式字母的數量爲2個以上,年 字面解釋,無論位數的數字。因此,使用 模式「MM/DD/YYYY」,「01/11/12」解析到1月11日,公元12

所以現在的問題是,它是一個更好的在兩個輸入四個字母一年信年?

另一個問題是如果以兩個字母的格式預測年份,最好的方法是什麼。 因爲這個問題會在解析低於去年

Bond Start Date : 12-Jan-98 (1998) 
Bond End Date : 12-Jan-70 (2070) 

問候, Hanumant

+0

前進,ISO8601和ISO8601-Ext的是,你應該使用的唯一的日期格式。 – Bathsheba

回答

0

目前尚不清楚你的要求。

  1. 如果你問如何指定接受2位數字的年份(只)和常規解釋它們的日期格式,那麼你應該使用"dd-mm-yy"

  2. 如果你問如何指定接受2位數的年和解釋它們傳統上,日期格式,ALSO處理4(或以上)的數字裏,那麼你就不能。正如javadoc所說,如果您使用"dd-mm-yyyy",則2位數字的年份被解釋爲公元一世紀的年份。

    一種可能的解決方案是使用TWO格式。首先嚐試使用"dd-mm-yy"解析,如果失敗,請嘗試"dd-mm-yyyy"

    但是,這是一個黑客...如果用戶可能實際上需要輸入歷史日期,則會出現問題。

  3. 如果你問你應該做什麼,那麼我建議你擺脫模棱兩可的ad-hoc格式,迫使你(有效地)猜測用戶的意思。

    • 如果用戶在基於字符的形式輸入日期/時間,要求他們使用的ISO 8601種格式之一,並分析用戶提供的日期/時間字符串時要嚴格。

    • 否則,爲用戶提供日期選擇器小部件。


的另一個問題是什麼,如果它在兩個字母的形式來預測年度最佳方式。

那麼這是問題的核心是不是它!在20世紀,我們都知道2位數字意味着什麼。你剛剛在前面打了19個。 (啊......那些是過去的美好時光!)

現在有必要使用不同的啓發式。這SimpleDateFormat使用啓發式由javadoc中如此描述:

「對於縮寫年份模式解析(」 Y」或‘YY’)的SimpleDateFormat必須解釋簡稱相對於某個世紀年。它。通過將日期調整爲創建SimpleDateFormat實例前80年和後20年內的日期,例如,使用「MM/dd/yy」模式和1997年1月1日創建的SimpleDateFormat實例,字符串「01/11/12」將被解釋爲2012年1月11日,而字符串「05/04/64」將被解釋爲1964年5月4日。「

啓發式是「現在」之後的80年前到20年。所以實際上,1998年1月12日是在1998年,而12年1月12日是在1970年......如果你使用「yy」格式的SimpleDateFormat進行解析。

如果您需要日期以表示其他內容,那麼您將需要使用不同的日期解析器。例如,如果您使用Joda時間庫,則可以指定「數據透視年」;即本世紀中兩位數字的下降年份。

參考:

+0

感謝您的詳細解釋。 – hanumant