20

假设当前日期是 5 月 28 日。如果我按顺序调用以下命令,输出变为

cal.add(Calendar.DATE, 1);  // Day = 29
cal.add(Calendar.DATE, 1);  // Day = 30
cal.add(Calendar.DATE, 1);  // Day = 31
cal.add(Calendar.DATE, 1);  // Day = 31
cal.add(Calendar.DATE, -1); // Day = 29

为什么这不跳到下个月?为什么它停留在第 31 位(但是当你减一时它会跳到 29)?

4

6 回答 6

33

我的朋友,您可以通过两种简单的方式轻松做到这一点。第一个是:

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, 1);

第二个是:

Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.HOUR_OF_DAY, 24);

我想你会想找到这个东西。谢谢。

于 2013-12-30T13:15:53.073 回答
19

当您向该Calendar.DATE字段添加 1 时,它也应该在达到月底时增加月份(5 月的情况下为 31),这样您编写的内容就没有意义了。调试它并确保日期值确实是您认为的值

于 2012-08-09T11:16:58.410 回答
4

这也应该可以解决问题。

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_YEAR, 1);

您可以测试它是否适用:

for (int i = 0; i < 365; i++) {
    cal.add(Calendar.DAY_OF_YEAR, 1);
    System.out.println(cal.getTime().toString());
}
于 2016-05-18T05:33:44.890 回答
2

看来我错了!根据 api,roll 只更新特定字段!

如果您将天数添加到日历中,请尝试

cal.roll(Calendar.DATE, 1);

这将在溢出时增加月份和年份

于 2012-08-09T11:18:11.223 回答
0

我检查了,它添加成功。看看我的代码和o/p:

Calendar  cal = Calendar.getInstance(); // today is 09-Aug-2012

for(int i=0;i<23;i++) {
    cal.add(Calendar.DATE, 1);  
}
System.out.println(cal.get(Calendar.DAY_OF_MONTH));

O/p

1

于 2012-08-09T11:17:22.847 回答
0

这不是一个答案,只是一个线索:我发现它发生在 DST 在日期之间开始时。可能是你的情况...

例如:今年巴西夏令时开始于“Sun Oct 20 00:00:00 2013”

Calendar cal = Calendar.getInstance(); // today = Sat Oct 19 00:00:00 BRT 2013
cal.add(Calendar.DATE, 1); // = Sat Oct 19 23:00:00 BRT 2013

不幸的是,我仍然不知道如何解决这个问题。

于 2013-10-28T18:37:08.613 回答