Почему calendar.add() возвращают 31/9/2018

Я хочу добавить 2 дня с сегодняшнего дня (29/9/2018), я использую:

val calendar = Calendar.getInstance()!!
calendar.set(CalendarDay.today().year, CalendarDay.today().month+1, CalendarDay.today().day)
calendar.add(Calendar.DAY_OF_MONTH, 2)

Но когда я вхожу (), дата не 1/10/2018, это 31/9/2018

1 ответ

Решение

Для более старого API, который вы выбрали для использования, вы можете упростить это до:

val today = Calendar.getInstance()                  // 2018-09-29
today.add(Calendar.DAY_OF_MONTH, 2);                // 2018-10-01

println(SimpleDateFormat().format(today.getTime())) // 2018-10-01

Там нет необходимости устанавливать Calendar экземпляр, который уже содержит текущую дату.

Ваш вывод, я думаю, возможно, вы неправильно прочитали или есть некоторая странная ошибка в реализации Android, потому что этот код:

val today = Calendar.getInstance()                   // 2018-09-29

// totally unneccessary:
today.set(today.get(Calendar.YEAR),  
          today.get(Calendar.MONTH), 
          today.get(Calendar.DAY_OF_MONTH))          // 2018-09-29

today.add(Calendar.DAY_OF_MONTH, 2);                 // 2018-10-01

println(SimpleDateFormat().format(today.getTime()))  // 2018-10-01

Работает нормально, хотя и имеет ненужный шаг (устанавливая в качестве даты, которая уже есть). И если вы добавите один к месяцу, как вы делали раньше, вы создадите неправильную дату:

val today = Calendar.getInstance()                  // 2018-09-29

// unnecessary and wrong:
today.set(today.get(Calendar.YEAR), 
          today.get(Calendar.MONTH)+1, 
          today.get(Calendar.DAY_OF_MONTH))         // 2018-10-29

today.add(Calendar.DAY_OF_MONTH, 2);                // 2018-10-31

println(SimpleDateFormat().format(today.getTime())) // 2018-10-31

Если вы можете использовать более новые API JSR 310, которые доступны на более новом Android, то это лучше, и это решение будет (если вы хотите использовать LocalDate):

val today = LocalDate.now()                           // 2018-09-29
val inTwoDays = today.plusDays(2)                     // 2018-10-01

println(DateTimeFormatter.ISO_DATE.format(inTwoDays)) // 2018-10-01

Пожалуйста, прочитайте о java.time пакет для большего количества классов, которые работают с датами, календарями, часовыми поясами и многим другим.

Другие вопросы по тегам