[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