前言
在将字符串转为java.util.Date
对象的时候,为了方便(主要是懒得做日期字符串的正则匹配)就干脆使用了java.text.SimpleDateFormat
的parse()
方法。但是我发现parse()
在解析日期字符串的时候本身存在一些问题。
问题代码
以下是出现问题的代码
DateFormat df=new SimpleDateFormat("yyyy-MM-dd");
try {
Date date=df.parse("2016--1-01");
System.out.println(date);
} catch (ParseException e) {
e.printStackTrace();
}
分析
这段代码我想很多人认为应该是抛出异常吧,但是实际上这段代码的运行结果是
Sun Nov 01 00:00:00 CST 2015
经过源码的调试后才知道2016--1-01
中,月份是可以作为负数识别的,既这个字符串被识别为2016
的1
月之前的2
个月的第一天。(2
个月是因为月份是从0
开始计算的)
解决方案
解决方案如下:
DateFormat df=new SimpleDateFormat("yyyy-MM-dd");
try {
Date date=df.parse("2016--1-01");
//指定日期/时间解析是否不严格,默认是不严格(true)
df.setLenient(false);
System.out.println(date);
} catch (ParseException e) {
e.printStackTrace();
}