为什么 calendar.add() return 31/9/2018

Why calendar.add() return 31/9/2018

我想从今天 (29/9/2018) 添加 2 天,我使用:

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

但是当我 Log() 它时,日期不是 1/10/2018,而是 31/9/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

如果您可以使用较新的 Android 上可用的较新的 JSR 310 API,那么它会更好,并且该解决方案是(假设您想使用 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 软件包的更多信息 类,它可以处理日期、日历、时区等。