';3-50-2014';是';2018年3月2日';对于Java?
我试图使用';3-50-2014';是';2018年3月2日';对于Java?,java,Java,我试图使用SimpleDateFormat解析一些日期字符串,我注意到了这个荒谬的事件 SimpleDateFormat sdf = new SimpleDateFormat("d-M-yyyy"); Date d = sdf.parse("3-50-2014"); 它没有给我一个错误,而是正常返回“3-2-2018”…这怎么会发生?如何避免这种情况?这是因为SimpleDateFormat处于宽松模式:它可以原谅“小”问题,例如将月份设置得太高,而不是调整年份。例如,在您的案例中,它将额外的
SimpleDateFormat
解析一些日期字符串,我注意到了这个荒谬的事件
SimpleDateFormat sdf = new SimpleDateFormat("d-M-yyyy");
Date d = sdf.parse("3-50-2014");
它没有给我一个错误,而是正常返回“3-2-2018”…这怎么会发生?如何避免这种情况?这是因为
SimpleDateFormat
处于宽松模式:它可以原谅“小”问题,例如将月份设置得太高,而不是调整年份。例如,在您的案例中,它将额外的48个月解释为四年
调用sdf.setLenient(false)
将解决此问题
如何避免这种情况
使用更好的日期时间库
这意味着:
-
- 捆绑
- 灵感来源于乔达时代,但重新设计
- 定义为
DateTimeFormatter formatter = DateTimeFormat.forPattern( "d-M-yyyy" );
DateTime dateTime = formatter.parseDateTime( "3-50-2014" ); // Note the invalid month number.
运行时,我们会抛出一个异常(如预期的)
线程“main”org.joda.time.IllegalFieldValueException中的异常:无法解析“3-50-2014”:monthOfYear的值50必须在[1,12]范围内
好吧,从2014年1月开始,再加上49个月——2018年2月。(月份从1开始,因此是49而不是50。)非常感谢。我不敢相信他们会默认这一点。