2010-12-10 68 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