谁能帮我理解为什么我得到不同的月份值
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
System.out.println(dateFormat.format(cal.getTime())
+ "--"
+ cal.get(Calendar.MONTH));
令人惊讶的显示
09/09/2012--8
谁能帮我理解为什么我得到不同的月份值
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
System.out.println(dateFormat.format(cal.getTime())
+ "--"
+ cal.get(Calendar.MONTH));
令人惊讶的显示
09/09/2012--8
在Calendar
课堂上,MONTH
从 index 开始0
。所以,January
是 0,February
是 1,因此September
是 8。
PS:-这是真的,这是课堂上Inconsistency
的Calendar
,所以我建议你看看,Joda-Time API
让你的生活更轻松,同时使用日期时间数据。
您可能的问题是Calendar 使用从零开始的索引来表示 months。因此,格式正确输出9
9 月,但吸气剂返回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 月 = 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