将日期转换为日历问题

时间:2013-02-25 14:02:42

标签: java date calendar

今天是2013-02-25,但为什么这段代码会返回2013-03-25?

       String currentDate =  new SimpleDateFormat("yyyy MM dd hh mm ss").format(new java.util.Date());
       System.out.println("current Date "+currentDate);
       StringTokenizer  token = new StringTokenizer(currentDate);
       Calendar cal = Calendar.getInstance();
       cal.set(Integer.parseInt(token.nextToken()),
               Integer.parseInt(token.nextToken()), 
               Integer.parseInt(token.nextToken()), 
               Integer.parseInt(token.nextToken()),
               Integer.parseInt(token.nextToken()),
               Integer.parseInt(token.nextToken()));
       String calenderDate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(cal.getTime());
       System.out.println("calender date "+calenderDate);
       cal.add(Calendar.MONTH, -1); //  set to one month ago
       String pastDate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(cal.getTime());
       System.out.println("past Date "+pastDate);
  

out put

     

当前日期2013 02 25 04 56 26

     

日历日期2013-03-25 04:56:26

     

过去日期2013-02-25 04:56:26

3 个答案:

答案 0 :(得分:5)

减去一个月。所以它适用于API。即:

  

month - 用于设置MONTH日历字段的值。月值基于0。例如,1月份为0。

答案 1 :(得分:3)

在JDK中,月份值以0开头。所以2 =三月。

来自Calendar#set docs

  

month - 用于设置MONTH日历字段的值。月值为0 - 基于。例如,1月的0

答案 2 :(得分:3)

日历月份从0开始,请参阅JavaDoc:

  

@param month用于设置MONTH日历字段的值。        *月值基于0。例如,1月份为0。

这是一个皇家PITA,而且大多数Java开发人员在这个问题上都失去了一些时间,这肯定违反了最不惊讶的原则。使用Calendar类时要非常小心......还有像Joda那样的替代品。