Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
';3-50-2014';是';2018年3月2日';对于Java?_Java - Fatal编程技术网

';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)
将解决此问题

如何避免这种情况

使用更好的日期时间库

这意味着:

    • 捆绑
    • 灵感来源于乔达时代,但重新设计
    • 定义为
乔达时间 使用Joda Time 2.4

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。)非常感谢。我不敢相信他们会默认这一点。