2013-02-25 142 views
1

今天是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); 

出把

当前日期2013 02 25 04 56 26

压延日期2013年3月25日4点56分26秒

过去的日期2013年2月25日04:56:26

回答

5

减去一个月份。所以它的作品API。 I.e .:

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

+0

看看日历日期没有过去的日期,即使过去的日期不正确,我已经扣除了一个月,但它仍然2013-02-25。设置方法中的 – solid 2013-02-25 14:07:54

+0

执行'Integer.parseInt(token.nextToken()) - 1'你在哪里通过月份。正如大家所说,日历的月份索引为0。因此,1月份期望0不等于1,依此类推。 – 2013-02-25 14:13:21

+0

你和其他人是绝对正确的,非常感谢。 – solid 2013-02-25 14:17:56

3

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

Calendar#set docs

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

3

日历个月从0开始,看到的JavaDoc:

@param一个月用来设置MONTH日历字段的值。 *月份值为0。例如1月份为0。

这是一个皇家PITA,大多数Java开发人员在那一个上失去了一些时间,它肯定违反了最不让人惊讶的原则。使用Calendar类时要非常小心......还有其他选择,比如乔达时间。