JavaScript中的日期减法

时间:2012-02-29 07:19:51

标签: javascript date subtraction

我有两个文本框,分别接受Start DateEnd Date,格式为YYYY / MM / DD。

如果用户选择超过开始日期50天的结束日期,我需要提醒用户。

这是我到目前为止所拥有的:

var startDate = new Date(document.getElementsByName('MYSTARTDATE').value);
var endDate = new Date(document.getElementsByName('MYENDDATE').value);
if ((endDate - startDate) > 50) 
{
    alert('End date exceeds specification');
    return false;
}

举个例子,我选择开始日期为2012/01/22,结束日期为2012/02/29

startDate = 'Sun Jan 22 00:00:00 UTC +0530 2012'
endDate = 'Wed Feb 29 00:00:00 UTC +0530 2012'

endDate - startDate的结果是3283200000,而不是38。我做错了什么?

2 个答案:

答案 0 :(得分:9)

3283200000是38天(以毫秒为单位)。

38天x 24小时x 60分钟x 60秒x 1000毫秒

此外,这两个日期之间有38天,而不是39天。

一个简单的解决方案是将变量(实际上常量)定义为一天中的毫秒数:

var days = 24*60*60*1000;

在比较中使用该变量作为“单位”:

if ((endDate - startDate) > 50*days) { 
     ...
}

答案 1 :(得分:0)

由于夏令时,Jeff B的解决方案不正确。如果startDate是,例如,10月31日,而endDate是12月20日,则这两次之间实际经过的时间是50天加上1小时,而不是50天。如果您的程序不关心一天中的时间并且在午夜设置所有时间,那么这尤其糟糕 - 在这种情况下,所有计算在整个冬季都将被关闭。

减去日期的部分正确方法是为每个时间实例化一个新的Date对象,然后使用一个具有每月天数的数组来计算实际经过的天数。

但更糟糕的是,欧洲改变时钟的日期与纽约时钟改变的日期不同。因此,单靠时区不足以确定已经过了多少天;位置也是必要的。

夏令时增加了日期处理的复杂性。在我的网站中,准确计算过去天数所需的功能近百行。实际的复杂性取决于计算是客户端还是服务器端,还是两者以及谁正在查看数据。