Java日历日期错误

时间:2012-10-20 08:54:59

标签: java date calendar simpledateformat

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

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

出人意料地显示

09/09/2012--8

5 个答案:

答案 0 :(得分:4)

Calendar班级中,MONTH从索引0开始。因此,January为0,February为1,因此September为8。

PS : - 这是Inconsistency课程中Calendar的确如此,所以我建议你看一下Joda-Time API来制作你的{{1}}使用日期时间数据时,生活更轻松。

答案 1 :(得分:2)

你可能遇到的问题是Calendar uses a zero-based index for months。因此格式正确输出9月的9,但getter返回8

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

日历中的月份从0开始

答案 4 :(得分: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