JavaScript日期减法

7

我希望找到一种方法,在两个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>

这个问题有更好的解决方法吗?
4个回答

7

Date构造函数中的月份是基于零的,因此您应该减去一。我认为使用时间戳计算差值更简单:

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

感谢修复,但这似乎在以下方面失败了: getDayDelta(2009,8,19); //应返回1,但返回0(我的本地时间是18日)。 - Hellnar
@Crib:问题在于incomingDate的时间部分为0小时,0分钟,0秒和0毫秒。您必须对“today”执行相同的操作,否则您将获得前/后一天的部分天数。我已编辑答案以反映更改。 - Grant Wagner
@CMS: 你需要移除所有时间信息(小时、分钟、秒和毫秒),否则你会得到0.99991513...的差值。 - Grant Wagner
@Grant Wagner:这就是为什么我在返回语句中使用Math.round的原因。 - Christian C. Salvadó

6

(2009,8,18) 不是8月18日。它是9月18日。


3
月份是基于零的索引。0代表一月。 - Sampson
1
哦,JavaScript,你真有趣! - Rebs

5
你可以在每个日期对象上调用getTime(),然后从较晚的时间中减去较早的时间。这将给出两个对象之间的毫秒差异。从那里开始,很容易算出天数。
但是要注意以下几点:1)夏令时,2)确保你的时间来自同一个时区。

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));

1
是的,ASP .NET Ajax框架扩展了客户端的Date对象。 - Christian C. Salvadó

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接