代码之家  ›  专栏  ›  技术社区  ›  mducc

Why calendar.add()返回日期:2018年9月31日

  •  0
  • mducc  · 技术社区  · 7 年前

    我想从今天(2018年9月29日)起增加2天,我使用:

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

    1 回复  |  直到 7 年前
        1
  •  3
  •   Jayson Minard    7 年前

    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 已包含当前日期的实例。

    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上可用的较新的jsr310api,那么它会更好,而且解决方案会更好(假设您想要使用它) 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