2009-08-18 84 views
7

我正在寻找一种方法来做两个javascript日期对象之间的适当减法并获得日增量。javascript日期减法

这是我的做法,但它对于今天的日期无法作为输入:

<script type="text/javascript"> 
function getDayDelta(incomingYear,incomingMonth,incomingDay){ 
var incomingDate = new Date(incomingYear,incomingMonth,incomingDay); 
var today = new Date(); 

var delta = incomingDate - today; 
var resultDate = new Date(delta); 
return resultDate.getDate(); 
} 
//works for the future dates: 
alert(getDayDelta(2009,9,10)); 
alert(getDayDelta(2009,8,19)); 

//fails for the today as input, as expected 0 delta,instead gives 31: 
alert(getDayDelta(2009,8,18)); 
</script> 

什么将是这更好的方法呢?

回答

7

在日期构造函数的月份数是零基础的,你应该。减去一个,我认为这是simplier使用时间戳来计算增量:

function getDayDelta(incomingYear,incomingMonth,incomingDay){ 
    var incomingDate = new Date(incomingYear,incomingMonth-1,incomingDay), 
     today = new Date(), delta; 
    // EDIT: Set time portion of date to 0:00:00.000 
    // to match time portion of 'incomingDate' 
    today.setHours(0); 
    today.setMinutes(0); 
    today.setSeconds(0); 
    today.setMilliseconds(0); 

    // Remove the time offset of the current date 
    today.setHours(0); 
    today.setMinutes(0); 

    delta = incomingDate - today; 

    return Math.round(delta/1000/60/60/ 24); 
} 


getDayDelta(2008,8,18); // -365 
getDayDelta(2009,8,18); // 0 
getDayDelta(2009,9,18); // 31 
+0

感谢您的修复,但这似乎失败: getDayDelta(2009,8,19); //返回1,但返回0(在我的本地时间是18) – Hellnar 2009-08-18 18:05:12

+0

是的,那是因为'today'包含时间,请参阅我的编辑... – CMS 2009-08-18 18:50:01

+0

@Crib:问题在于'incomingDate'的时间部分是0小时,0分钟,0秒和0毫秒。你必须对“今天”做同样的事情,否则你将会在一天之前/之后得到部分日子。我编辑了答案以反映这一变化。 – 2009-08-18 18:51:02

5

您可以在每个日期对象上调用getTime(),然后从较早的日期对象中减去该日期。这会给你两个对象之间的毫秒数差。从那里,很容易达到几天。

几个打嗝要注意,但:1)夏时制,2)确保您的时间来自同一时区。

6

(2009年8月18日)不是8月18日。现在是9月18日。

+3

这几个月是一个从零开始的指数。 0是1月。 – Sampson 2009-08-18 17:46:18

+0

这是正确的,因为日期函数零指数为几个月。 – MacAnthony 2009-08-18 17:46:20

+1

哦javascript,你好笑! – Rebs 2016-07-28 06:07:06

0

这将更好地工作,但它不没有正确处理负面的结果值。你可能想简单地解析这些值并处理它们。

function getDayDelta(incomingYear,incomingMonth,incomingDay){ 
var incomingDate = new Date(incomingYear,incomingMonth-1,incomingDay); 
var today = new Date(); 
today = new Date(Date.parse(today.format("yyyy/MM/dd"))); 

var delta = incomingDate - today; 
if (delta == 0) { return 0; } 
var resultDate = new Date(delta); 
return resultDate.getDate(); 
} 
//works for the future dates: 
alert(getDayDelta(2009,9,10)); 
alert(getDayDelta(2009,8,19)); 
alert(getDayDelta(2009, 8, 18)); 
+0

格式不是函数http://is.gd/2n46k – CMS 2009-08-18 17:51:20

+0

那么它为什么工作? (我的环境是ASP.NET。) – 2009-08-18 18:53:48

+1

是的,ASP .NET Ajax Framework扩展了客户端的Date对象 – CMS 2009-08-18 19:07:28