2015-04-17 30 views
0

使用momentjs diff函数将今天和明天的日期(4月17日和18日)与当前时刻(现在是4月17日,对我来说)进行比较时,天计算都是0.当比较的日期相近时,来自momentjs diff的意外结果

这是为什么,以及如何获得更明智的结果?

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/

+1

我看0,0,1,2,你在哪里位于何处?说得通。今天不到一天(显然),明天午夜不到二十四小时。 –

+0

不确定它是否与您的问题有关,但请注意[diff](http://momentjs.com/docs/#/displaying/difference/)返回自Moment.js 2.0.0以来的舍入数。如果你想要一个浮点数,把它作为第三个参数传给'true'。 – aug

+0

@ChristianHain我确实需要一个整数,但是我想要1作为结果,直到事件发生前一晚的晚上11:59。也许如果我将事件日期设置为11:59 pm时,那么呢?我不认为位置应该重要,但我在新西兰与时区GMT + 12 –

回答

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

+0

完美,非常感谢! –

1

MomentJS Docs on .diff()

默认情况下,moment#diff将返回数(四舍五入)。如果你想要浮点数,传入true作为第三个参数。在2.0.0之前,moment#diff返回舍入数字,而不是舍入的舍弃数字。

因为你在2015年4月17日午夜运行此代码后的2015年4月“现在”和午夜18之间向下取整天数为0

我可以看到得到了更“明智”的答案两个选项:

  1. 通行证true.diff()第三个参数来获得一个浮点数,没有舍入。你可以看到结果here
  2. 当您在函数中设置todaysdate的值时,请使用moment().startOf('day')获取今天午夜的日期,该日期与明天1明天的天数会有相差。
+0

你是指在中午之后,而不是在午夜之后? –

+0

感谢您的解释!按照您和其他答案的建议,我使用了.startOf('day')。 –

+1

不,我的意思是午夜,一天开始后是0小时,0分,0秒和0毫秒。 :-)如果你只关心整个日子,那么总是通过使用''去掉你所有'时间'日期的小时,分​​钟和秒。startOf('day')',它会减少你遇到的错误。 – GregL