【问题标题】:Comparing today's date with another date in moment is returning the wrong date, why?将今天的日期与另一个日期进行比较会返回错误的日期,为什么?
【发布时间】:2012-09-26 02:13:19
【问题描述】:

我正在使用 moment.js 1.7.0 尝试将今天的日期与另一个日期进行比较,但 diff 函数说由于某种原因它们相隔 1 天。

代码:

var releaseDate = moment("2012-09-25");
var now = moment(); //Today is 2012-09-25, same as releaseDate  
console.log("RELEASE: " + releaseDate.format("YYYY-MM-DD"));
console.log("NOW: " + now.format("YYYY-MM-DD"));
console.log("DIFF: " + now.diff(releaseDate, 'days'));

控制台:

RELEASE: 2012-09-25
NOW: 2012-09-25
DIFF: 1 

想法?

【问题讨论】:

  • 我有 1.7.0,我测试了你的代码,我得到了 DIFF: 0 - 你确定你的 moment.js 没有任何改变吗?
  • 我认为这与时区或 utc/local 有关。如果我记录releaseDate 和now 的.hours(),它会为我产生不同的结果。如果我使用 var now = moment().sod() (docs) 它目前可以按预期工作,但我不确定我对它的信任程度。

标签: javascript momentjs


【解决方案1】:

基于documentation(和简短的测试),moment.js 围绕日期对象创建包装器。声明:

var now = moment();

创建一个“时刻”对象,其核心有一个新的 Date 对象,就像由 new Date() 创建的一样,因此小时、分钟和秒将设置为当前时间。

声明:

var releaseDate = moment("2012-09-25");

创建一个时刻对象,它的核心是一个新的 Date 对象,好像由 new Date(2012, 8, 25) 创建的,其中本地时区的小时、分钟和秒都将设置为零。

moment.diff 返回一个基于两个日期之间以毫秒为单位的四舍五入 差异的值。要查看完整值,请将true 作为第三个参数传递:

 now.diff(releaseDate, 'days', true)
 ------------------------------^

因此,即使在同一本地日期运行,now.diff(releaseDate, 'days') 是 0 还是 1 都取决于代码运行的时间和本地时区。

如果您只想比较日期,请使用:

var now = moment().startOf('day'); 

这会将时间设置为本地时区的 00:00:00。

【讨论】:

  • 感谢您的解释!使用moment().sod() 消除了我的舍入问题,正如使用您提到的第三个参数测试的那样。
  • 请注意,sod 仅适用于版本 2,此时您必须使用 startOf('day')。
【解决方案2】:

RobG 对这个问题的回答是正确的,所以这个答案只适用于那些搜索如何在 momentjs 中比较日期的人。

我尝试像上面提到的那样使用 startOf('day'):

var compare = moment(dateA).startOf('day') === moment(dateB).startOf('day');

这对我不起作用。

我不得不使用isSame:

var compare = moment(dateA).isSame(dateB, 'day');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    相关资源
    最近更新 更多