0

在构建 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

我究竟做错了什么?

4

5 回答 5

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);
于 2012-11-07T10:57:00.017 回答
2

月份以 0 开头GregorianCalendar

public static final int JANUARY = 0; 

它在 Clanedar 类中声明。2 月是 1。所以更新代码 -

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

或者

GregorianCalendar date = new GregorianCalendar(2012,0,1);
于 2012-11-07T10:57:31.420 回答
1

月份是从 0 开始的。一月 == 0。来自Calendar#MONTHjavadoc:

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

于 2012-11-07T10:57:29.827 回答
0

如果您不想要索引为 0 的月份,请尝试Joda 时间

于 2012-11-07T10:58:40.463 回答
0

这是记录在案的行为

month - 用于在日历中设置 MONTH 日历字段的值。月份值从 0 开始。例如,0 表示一月。

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

于 2012-11-07T11:00:33.087 回答