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-03-25 04:56:26

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

4

3 回答 3

5

月减一。所以它适用于API。IE:

month - 用于设置 MONTH 日历字段的值。月份值从 0 开始。例如,0 表示一月。

于 2013-02-25T14:03:54.253 回答
3

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

Calendar#set文档

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

于 2013-02-25T14:04:19.870 回答
3

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

@param month 用于设置MONTH日历字段的值。* 月份值从 0 开始。例如,0 表示一月。

这是一个皇家 PITA,大多数 Java 开发人员在那个上浪费了一些时间,它肯定违反了最小意外原则。使用 Calendar 类时要非常小心......还有 Joda time 等替代方法。

于 2013-02-25T14:05:43.713 回答