2010-12-10 70 views
4

我與模式yyyy-M-d"構造SimpleDateFormat,並以下情形:java的SimpleDateFormat的行爲

String str = "02-03-04";   
SimpleDateFormat f = new SimpleDateFormat("yyyy-M-d"); 
f.setLenient(false); 
System.out.println(f.parse(str)); 

輸出是Sat Mar 04 00:00:00 EST 2

我的目標是隻能望塵莫及日期在像2004-02-格式03並忽略02-03-04。我認爲模式中的yyyy需要4位數的年份,但顯然情況並非如此。任何人都可以解釋爲什麼這不是拋出解析異常?我想它......

+0

除此之外,正則表達式也應該工作(只是檢查它匹配,然後使用解析器)。 – lijie 2010-12-10 15:51:52

+0

我簡化了這篇文章的問題。實際上,我有許多符合各種模式的日期格式。事後看來,也許正則表達式(或JODA時間)會更好......但這就是我現在所處的位置。 – 2010-12-10 15:53:26

+0

如果它的東西是粘附的,那麼我真的不能提出比使用正則表達式首先驗證更好的方法(應該很容易爲每個日期模式編寫一個正則表達式,考慮到日期模式會捕獲格式中的其他錯誤? )。 – lijie 2010-12-10 16:10:36

回答

7

好了,我可以從the docs解釋:

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

這有可能是Joda Time將嚴格 - 這是一般更好的API,IMO。 ..

你可以總是拋出一個異常,如果年份是小於1000解析後...

使用更具體的API
+0

+1,This bit me最近我在調試時看到我的日期是從10年開始有點令人不安 – 2010-12-10 15:49:53

+0

如果年份少於1000年,則不適用。如果用戶真正打算並輸入'0002-03-04'會怎麼樣? – lijie 2010-12-10 15:50:31

+0

我同意使用喬達時間會更好。但是這是我目前無法切換的應用程序的一大部分。儘管如此,我一定會考慮切換。 – 2010-12-10 15:51:52