Java日历日期错误

任何人都可以帮助我理解为什么我得到不同的月份值

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); System.out.println(dateFormat.format(cal.getTime()) + "--" + cal.get(Calendar.MONTH)); 

令人惊讶地显示

 09/09/2012--8 

Calendar类中, MONTH从索引0开始。 因此, January是0, February是1,因此September是8。

PS : – 这确实是Calendar类中的Inconsistency ,因此我建议您查看Joda-Time API ,以便在处理日期时间数据时让您的生活更轻松。

您可能遇到的问题是, Calendar会使用基于零的索引数月 。 因此格式正确输出9月9日,但getter返回8

日历这个愚蠢和不一致吗? 是! 使用Joda-Time API来处理日期和时间。 据我所知,它是目前事实上的标准,直到JSR 310出现。

Calendar.MONTH返回从0开始的值,即JANUARY用0表示。这样SEPTEMBER为8。

日历中的月份从0开始

其他答案都是正确的。 java.util.Calendar类对月份数使用从零开始的计数。 避免使用java.util.Date/Calendar类的众多原因之一。

使用Joda-Time 2.3库,这种工作更容易。 值得庆幸的是,它合理地使用了一个基于计数的计数,例如1月= 1,12月= 12。

 java.util.Calendar cal = java.util.Calendar.getInstance(); // Though not required here for this one purpose, it's better to specify a time zone than rely on default. DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" ); DateTime dateTime = new DateTime( cal.getTime(), timeZone ); // Extract month. Note how these two lines call similar sounding methods that are actually quite different. // One returns a primitive int value. The other returns an object of nested class DateTime.Property. int monthNumber = dateTime.getMonthOfYear(); String monthName = dateTime.monthOfYear().getAsText( Locale.FRENCH ); 

转储到控制台……

 System.out.println( "dateTime: " + dateTime ); System.out.println( "monthNumber: " + monthNumber ); System.out.println( "monthName: " + monthName ); 

跑的时候……

 dateTime: 2014-02-10T02:58:35.386-05:00 monthNumber: 2 monthName: février