日期:2014-05-16  浏览次数:20371 次

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的。

?

1 楼 dohkoos 2008-05-23  
如果是2009-1-31号加上一个月呢??2009-1-30呢?

http://dohkoos.name/?p=509
这是我写的关于这篇文章的阅读笔记