在做项目计算日期相加减的时候发现了一个问题,代码如下:
Java:
Calendar data = Calendar.getInstance();
data.set( Calendar.MONTH, 1 );
data.set( Calendar.DATE, 29 );
data.add( Calendar.MONTH, 12 ); //增加一年
System.out.println( data.getTime().toLocaleString() );
打印结果:2009-2-28
javaScript:
var data = new Date( 2008,1,29 );
data.setMonth( data.getMonth() + 12 ); //增加一年
alert(data.getYear()+"-"+(data.getMonth()+1)+"-"+data.getDate() );
打印结果:2009-3-1
结果发现java和javascipt处理日期的方式有一天的差异,为什么会出现这样的问题呢?是不是只有2月才会出现呢,假如当前日期是2008-03-31
当前日期加上一个月后,代码如下:
Java:
Calendar data = Calendar.getInstance();
data.set( Calendar.MONTH, 2 );
data.set( Calendar.DATE, 31 );
data.add( Calendar.MONTH, 1 ); //增加一个月
System.out.println( data.getTime().toLocaleString() );
打印结果:2008-4-30
javaScript:
var data = new Date( 2008,2,31 );
data.setMonth( data.getMonth() + 1 ); //增加一个月
alert(data.getYear()+"-"+(data.getMonth()+1)+"-"+data.getDate() );
打印结果:2008-5-1
当前日期加上两个月后,代码如下:
Java:
Calendar data = Calendar.getInstance();
data.set( Calendar.MONTH, 2 );
data.set( Calendar.DATE, 31 );
data.add( Calendar.MONTH, 2 ); //增加两个月
System.out.println( data.getTime().toLocaleString() );
打印结果:2008-5-31
javaScript:
var data = new Date( 2008,2,31 );
data.setMonth( data.getMonth() + 2 ); //增加两个月
alert(data.getYear()+"-"+(data.getMonth()+1)+"-"+data.getDate() );
打印结果:2008-5-31
当前日期加上三个月后,代码如下:
Java:
Calendar data = Calendar.getInstance();
data.set( Calendar.MONTH, 2 );
data.set( Calendar.DATE, 31 );
data.add( Calendar.MONTH, 3); //增加三个月
System.out.println( data.getTime().toLocaleString() );
打印结果:2008-6-30
javaScript:
var data = new Date( 2008,2,31 );
data.setMonth( data.getMonth() + 3 ); //增加三个月
alert(data.getYear()+"-"+(data.getMonth()+1)+"-"+data.getDate() );
打印结果:2008-7-1
为什么会出现这样的差距呢,原因肯定是java和javascript处理日期的方式不一样,那在什么条件下会出现这样的结果呢?
结论:
当进行日期计算的时候,当前日期的月份必须是大月,并且是在这个月的最后一天也就是31号,比如2008-3-31号,当给这个日期加上一个月,得到的日期是个小月就会出现这样的情况。比如在2008-3-31这天加上一月,那因该是4月份,4月就是小月,那java就是4月30号,javascript就是5月1号,相差一天。当加上2月后,就是5月,5月是大月,那么计算的结果都是5月31号。
解决方法:
在这里也没有什么好的解决方法,就是统一一下计算日期的方式,要么用java的要么用javaScript的。
Java:
Calendar data = Calendar.getInstance();
data.set( Calendar.MONTH, 1 );
data.set( Calendar.DATE, 29 );
data.add( Calendar.MONTH, 12 ); //增加一年
System.out.println( data.getTime().toLocaleString() );
打印结果:2009-2-28
javaScript:
var data = new Date( 2008,1,29 );
data.setMonth( data.getMonth() + 12 ); //增加一年
alert(data.getYear()+"-"+(data.getMonth()+1)+"-"+data.getDate() );
打印结果:2009-3-1
结果发现java和javascipt处理日期的方式有一天的差异,为什么会出现这样的问题呢?是不是只有2月才会出现呢,假如当前日期是2008-03-31
当前日期加上一个月后,代码如下:
Java:
Calendar data = Calendar.getInstance();
data.set( Calendar.MONTH, 2 );
data.set( Calendar.DATE, 31 );
data.add( Calendar.MONTH, 1 ); //增加一个月
System.out.println( data.getTime().toLocaleString() );
打印结果:2008-4-30
javaScript:
var data = new Date( 2008,2,31 );
data.setMonth( data.getMonth() + 1 ); //增加一个月
alert(data.getYear()+"-"+(data.getMonth()+1)+"-"+data.getDate() );
打印结果:2008-5-1
当前日期加上两个月后,代码如下:
Java:
Calendar data = Calendar.getInstance();
data.set( Calendar.MONTH, 2 );
data.set( Calendar.DATE, 31 );
data.add( Calendar.MONTH, 2 ); //增加两个月
System.out.println( data.getTime().toLocaleString() );
打印结果:2008-5-31
javaScript:
var data = new Date( 2008,2,31 );
data.setMonth( data.getMonth() + 2 ); //增加两个月
alert(data.getYear()+"-"+(data.getMonth()+1)+"-"+data.getDate() );
打印结果:2008-5-31
当前日期加上三个月后,代码如下:
Java:
Calendar data = Calendar.getInstance();
data.set( Calendar.MONTH, 2 );
data.set( Calendar.DATE, 31 );
data.add( Calendar.MONTH, 3); //增加三个月
System.out.println( data.getTime().toLocaleString() );
打印结果:2008-6-30
javaScript:
var data = new Date( 2008,2,31 );
data.setMonth( data.getMonth() + 3 ); //增加三个月
alert(data.getYear()+"-"+(data.getMonth()+1)+"-"+data.getDate() );
打印结果:2008-7-1
为什么会出现这样的差距呢,原因肯定是java和javascript处理日期的方式不一样,那在什么条件下会出现这样的结果呢?
结论:
当进行日期计算的时候,当前日期的月份必须是大月,并且是在这个月的最后一天也就是31号,比如2008-3-31号,当给这个日期加上一个月,得到的日期是个小月就会出现这样的情况。比如在2008-3-31这天加上一月,那因该是4月份,4月就是小月,那java就是4月30号,javascript就是5月1号,相差一天。当加上2月后,就是5月,5月是大月,那么计算的结果都是5月31号。
解决方法:
在这里也没有什么好的解决方法,就是统一一下计算日期的方式,要么用java的要么用javaScript的。