任何人都可以帮助我理解为什么我会得到不同的月份值
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
System.out.println(dateFormat.format(cal.getTime())
+ "--"
+ cal.get(Calendar.MONTH));
出人意料地显示
09/09/2012--8
答案 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