javascript - 使用 moment 计算 2 个日期之间的天数

标签 javascript momentjs

我正在尝试使用以下代码计算 Javascript 中两个日期之间的天数。

    console.log(self.StartDate());
    var start = moment(self.StartDate(), "YYYY-MM-DD");
    console.log(start);
    console.log(self.EndDate());
    var end = moment(self.EndDate(), "YYYY-MM-DD");
    console.log(end);
    var duration = moment.duration(start.diff(end));
    console.log(duration);

    //no of days between start and end
    console.log(duration.asDays());

控制台输出:

Thu Jun 20 2019 01:00:00 GMT+0100 (British Summer Time)
n {_isAMomentObject: true, _i: Thu Jun 20 2019 01:00:00 GMT+0100 (British Summer Time), _f: "YYYY-MM-DD", _isUTC: false, _pf: {…}, …}_d: Wed Aug 19 0020 00:00:00 GMT-0001 (British Summer Time) {}_f: "YYYY-MM-DD"_i: Thu Jun 20 2019 01:00:00 GMT+0100 (British Summer Time) {}_isAMomentObject: true_isUTC: false_locale: r {_ordinalParse: /\d{1,2}(th|st|nd|rd)/, ordinal: ƒ, _abbr: "en", _ordinalParseLenient: /\d{1,2}(th|st|nd|rd)|\d{1,2}/}_pf: {empty: false, unusedTokens: Array(0), unusedInput: Array(3), overflow: 1, charsLeftOver: 49, …}__proto__: Object
Mon Jun 24 2019 15:10:41 GMT+0100 (British Summer Time)
n {_isAMomentObject: true, _i: Mon Jun 24 2019 15:10:41 GMT+0100 (British Summer Time), _f: "YYYY-MM-DD", _isUTC: false, _pf: {…}, …}
Ea {_milliseconds: -126230400000, _days: 0, _months: 0, _data: {…}, _locale: r}
-1461

self.StartDate() 是 20/06/2019,self.EndDate() 是 24/06/2019,所以我很高兴警报显示 4,但它显示 -1461。

为什么会这样?

最佳答案

问题是您的日期不是 formatted the way you tell moment.js they are20/06/2019DD/MM/YYYY,而不是 YYYY-MM-DD。根据文档,非数字字符将被忽略,因此 20/06/2019 将被解析为 2006-20-19。由于这样的日期不存在,Moment.js 会尝试猜测您的实际含义,并得出 2020-06-19:

var start = moment("20/06/2019", "YYYY-MM-DD");

console.log(start);
<script src="https://cdn.jsdelivr.net/momentjs/2.14.1/moment-with-locales.min.js"></script>

结束日期也会发生同样的情况。

您需要更改告诉 Moment.js 的格式,或者修复开始和结束日期以使用您指定的格式,在这两种情况下,您都会得到正确的结果:

var self = {
    StartDate: () => "20/06/2019",
    EndDate: () => "24/06/2019"
}

var start = moment(self.StartDate(), "DD/MM/YYYY"); //using the correct format
var end = moment(self.EndDate(), "DD/MM/YYYY");
var duration = moment.duration(start.diff(end));

console.log(duration.asDays());
<script src="https://cdn.jsdelivr.net/momentjs/2.14.1/moment-with-locales.min.js"></script>

var self = {
    StartDate: () => "2019-06-20", //using dates in the correct format
    EndDate: () => "2019-06-24"
}

var start = moment(self.StartDate(), "YYYY-MM-DD");
var end = moment(self.EndDate(), "YYYY-MM-DD");
var duration = moment.duration(start.diff(end));

console.log(duration.asDays());
<script src="https://cdn.jsdelivr.net/momentjs/2.14.1/moment-with-locales.min.js"></script>

关于javascript - 使用 moment 计算 2 个日期之间的天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56738328/

相关文章:

javascript - 防止复选框同时被选中和禁用

javascript - 从 iframe 打印 pdf 文件

javascript - 如何使用时刻获取不同时区的日期之间的差异?

angularjs - 如何在 Angular View 中获取完整的 momentjs api?

javascript - moment.js 时间不是 UTC

javascript - 婴儿数量多于成人时如何发出警报

javascript - 使用编码 gzip 的 ajax 发送请求不起作用

javascript - 如何在 javascript 中用空字符串替换 HTML 注释

javascript - 为什么 Moment.js 一天结束于 22 :59:59. 999Z?

javascript - 使用以秒为单位的偏移量将 utc 时间戳转换为本地时间