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

时间:2018-09-29 04:36:46

标签: android kotlin days java.util.calendar

我想从今天(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)

但是当我登录()时,日期不是2018年1月10日,则是31/9/2018

1 个答案:

答案 0 :(得分:3)

对于您选择使用的较旧的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软件包的信息,以了解更多适用于日期,日历,时区等的类。