很奇怪的Java 日期处理问题,月底才会出现

[code="java"]public class TestDate {

public static void main(String[] args) {

    Date date = new Date();
    String selectedYear = "2011";
    String selectedMonth = "3";
    // date.setDate(1); // 这里不屏蔽的话,问题就不会出现了,不知为什么
    if (selectedYear != null) {
        date.setMonth(Integer.valueOf(selectedMonth).intValue());
        date.setYear(Integer.valueOf(selectedYear).intValue() - 1900);

    }
    System.out.println("selectedYear : " + Integer.valueOf(date.getYear() + 1900));
    System.out.println("selectedMonth : " + Integer.valueOf(date.getMonth()));

    Date startDate = new Date(date.getYear(), date.getMonth(), 1);
    Date endDate = new Date(date.getYear(), date.getMonth() + 1, 1);
    System.out.println("Start Date :" + startDate);
    System.out.println("End Date :" + endDate);

}

}[/code]

里面是一段很早以前的代码,前台输入的是 2011年4月,后台处理了一下,变成5月了(只有月底才有可能出现的),麻烦大家帮忙分析一下为什么

[quote]
fmjsjx 写道
刚刚测试了一下,的确有些问题,可能是由于java.util.Date#setXXX方法都过期了,jdk不再维护这些方法,所以在JDK更新了后造成某些错误,建议楼主改用java.util.Calendar重构代码。
Calendar示例:
Java代码 收藏代码

Calendar calendar = Calendar.getInstance();  
calendar.set(2011, 3, 1);  
Date date = calender.getTime();  

重写肯定可以搞定,就是想知道现在的代码为什么造成这个结果了

[/quote]
话说,楼主是不是没仔细看,我简单加一下吧:
由于java.util.Date#setXXX()方法在很早以前(好像是JDK1.1)就过期了,sun公司不再维护这些方法,也不再保证这些方法在以后的JDK版本中的正确性,所以在JDK升级了以后,就有可能造成这些方法在使用过程中会发生错误,这些sun公司都是不负责的。
所以,基本上很有可能是JDK本身的问题,楼主没有必要深入研究。

java中的month是从0开始的哇。也就是说0是表示一月,以此类推,所以你输入4应该是表示五月的,你可以看看API。 :D

刚刚测试了一下,的确有些问题,可能是由于java.util.Date#setXXX方法都过期了,jdk不再维护这些方法,所以在JDK更新了后造成某些错误,建议楼主改用java.util.Calendar重构代码。
Calendar示例:
[code="java"]
Calendar calendar = Calendar.getInstance();
calendar.set(2011, 3, 1);
Date date = calender.getTime();
[/code]

按照Date的构造方法来时没问题的,month的值是0到11,设置month为3,代表是4月份。则date.getMonth()肯定是3,而new Date(year,month,day),输出来的date肯定是4月份了,date.getMonth+1则是4,表示就是5月了。至于setDate(1)只是把当前日设定为1号而已,不会影响month。
如楼上说,建议使用Caladar