Calendar和DateFormat的奇怪行为

时间:2012-11-07 10:56:00

标签: java date formatting

构建Calendar对象然后以特定样式格式化时,我遇到了非常奇怪的行为。

让代码进行讨论:

public class Test 
{
    public static void main(String[] args) 
    {
        SimpleDateFormat frmt = new SimpleDateFormat();
        frmt.applyPattern("yyyy-MM-dd");
        GregorianCalendar date = new GregorianCalendar(2012,1,1);
        System.out.println(frmt.format(date.getTime()));
    }
}

输出结果为:

2012-02-01

预期的产出当然是:

2012-01-01

我做错了什么?

5 个答案:

答案 0 :(得分:3)

月份从0开始,因此new GregorianCalendar(2012,1,1);是2月1日。对于1月1日,您将使用

new GregorianCalendar(2012,0,1);
// or even better 
new GregorianCalendar(2012,Calendar.JANUARY,1);

答案 1 :(得分:2)

月份以GregorianCalendar中的0开头。

public static final int JANUARY = 0; 

它在Calendar类中声明。对于二月它是1.所以更新代码 -

GregorianCalendar date = new GregorianCalendar(2012,Calendar.JANUARY,1);

GregorianCalendar date = new GregorianCalendar(2012,0,1);

答案 2 :(得分:1)

月份基于0。 1月== 0.来自Calendar#MONTH javadoc:

  

get和set的字段编号,表示月份。这是特定于日历的值。一年中的第一个月是1月,即0;最后一个取决于一年中的月数。

答案 3 :(得分:0)

如果您不希望索引为0的月份

,请尝试Joda time

答案 4 :(得分:0)

documented behavior

  

month - 用于在日历中设置MONTH日历字段的值。月值基于0。例如,1月份为0。

建议在使用此构造函数时使用Calendar中的常量,例如[Calendar.JANUARY][2]