0

谁能帮我理解为什么我得到不同的月份值

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

令人惊讶的显示

09/09/2012--8
4

5 回答 5

5

Calendar课堂上,MONTH从 index 开始0。所以,January是 0,February是 1,因此September是 8。

PS:-这是真的,这是课堂上InconsistencyCalendar,所以我建议你看看,Joda-Time API让你的生活更轻松,同时使用日期时间数据。

于 2012-10-20T08:55:44.577 回答
3

您可能的问题是Calendar 使用从零开始的索引来表示 months。因此,格式正确输出99 月,但吸气剂返回8.

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

于 2012-10-20T08:58:27.923 回答
2

Calendar.MONTH 返回基于 0 的值,即JANUARY用 0 表示。这样 SEPTEMBER 是 8。

于 2012-10-20T08:58:18.850 回答
1

日历中的月份从 0 开始

于 2012-10-20T08:59:55.853 回答
1

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

使用Joda-Time 2.3 库可以更轻松地完成此类工作。值得庆幸的是,它明智地使用了基于 1 的计数,例如 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 );

转储到控制台...</p>

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

运行时……</p>

dateTime: 2014-02-10T02:58:35.386-05:00
monthNumber: 2
monthName: février
于 2014-02-10T08:03:12.040 回答