Добавление дня к календарю в Android завершается с ошибкой 31-го

Предположим, что в настоящее время дата 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)?

Ответ 1

Когда вы добавляете 1 в поле Calendar.DATE, он должен также увеличивать месяц, когда достигается конец месяца (31 в случае с маем), так что вы не пишете, что имеет смысл. Отладьте его и убедитесь, что значение дня действительно соответствует вашим ожиданиям.

Ответ 2

Вы можете легко сделать это двумя простыми способами, мой друг. Первый:

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

а второй:

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

Я думаю, вы хотели бы найти эту вещь. Спасибо.

Ответ 3

Кажется, я ошибаюсь! в соответствии с api, roll обновляет только определенное поле!

если вы добавили дни в календарь, попробуйте

cal.roll(Calendar.DATE, 1);

это увеличит месяц и год при переполнении

Ответ 4

Какую реализацию Календаря вы используете? Потому что он работает для всех остальных...

Ответ 5

Я проверил, он добавляет успешно. Посмотрите мой код и о/р:

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));

О/р

1

Ответ 6

Это не ответ, просто подсказка: я обнаружил, что это происходит, когда DST начинается между датами. Возможно, это ваше дело...

Например: Brazillian 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

К сожалению, я до сих пор не знаю, как это сделать.

Ответ 7

Это также должно сделать трюк.

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());
}