当比较日期接近时,来自时刻js diff的意外结果

时间:2015-04-17 00:14:12

标签: javascript momentjs

当今天和明天的日期(4月17日和18日)与当前时刻(现在是4月17日,对我来说)使用momentjs diff函数进行比较时,数字计算的天数均为0.

为什么这样,以及什么方法可以获得更明智的结果?

function daysRemaining(eventdate) {
    var eventdatemoment = moment(eventdate);
    var todaysdate = moment();
    return eventdatemoment.diff(todaysdate, 'days');
}
console.log(daysRemaining('2015-04-16'));
console.log(daysRemaining('2015-04-17'));
console.log(daysRemaining('2015-04-18'));
console.log(daysRemaining('2015-04-19'));

给出结果:

-1
0
0
1

http://jsfiddle.net/ue110atu/1/

2 个答案:

答案 0 :(得分:1)

来自MomentJS Docs on .diff()

  

默认情况下,moment#diff会返回向下舍入的数字。如果需要浮点数,请将true作为第三个参数。在2.0.0之前,moment#diff返回舍入的数字,而不是舍入的 down 数字。

因为您在2015年4月17日午夜之后运行此代码,所以现在"现在"之间的整天数量向下舍入。 2015年4月18日午夜0

我可以看到两种选择,以获得更多"明智的"回答:

  1. true的第三个参数传递.diff()以获取浮点数,而不进行舍入。您可以看到结果here
  2. 在您的函数中设置todaysdate的值时,请使用moment().startOf('day')获取今天午夜的日期,这将明确与1明天的天数差异。

答案 1 :(得分:1)

function daysRemaining(eventdate) {
  var eventdatemoment = moment(eventdate);

  // Remove hours, minutes, seconds, etc. from today's date.
  var todaysdate = moment().startOf('day');

  return eventdatemoment.diff(todaysdate, 'days');
}

console.log(daysRemaining('2015-04-16'));
console.log(daysRemaining('2015-04-17'));
console.log(daysRemaining('2015-04-18'));
console.log(daysRemaining('2015-04-19'));