Почему calendar.add () возвращают 31/9/2018 - PullRequest
0 голосов
/ 29 сентября 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)

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

1 Ответ

0 голосов
/ 29 сентября 2018

Для более старого 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 для большего количества классов, которые работают с датами, календарями, часовыми поясами и т. д.

...