【问题标题】:Using moment to calculate the number of days between 2 dates使用时刻计算两个日期之间的天数
【发布时间】:2019-06-24 14:05:11
【问题描述】:

我正在尝试使用以下代码计算 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。

为什么会这样?

【问题讨论】:

  • 停止使用警报。使用console.log 并查看开发工具控制台选项卡中的输出。也就是说,您不会显示使用您声称使用的日期的代码,那么您能否显示 moment.js 在这两个日期中的想法(使用 console.log 然后复制输出)?
  • 20/06/2019 不是"YYYY-MM-DD"
  • @Mike'Pomax'Kamermans 修改了 OP
  • 你从哪里得到日期数据?

标签: javascript momentjs


【解决方案1】:

问题是您的日期不是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>

【讨论】:

    【解决方案2】:

    您的代码应该可以正常工作。您应该只在差异计算中交换 startend 以获得正值。

    var startDate = moment("2019-06-20", "YYYY-MM-DD");
    var endDate = moment("2019-06-24", "YYYY-MM-DD");
    var duration = moment.duration(startDate.diff(endDate));
    
    //no of days between start and end
    console.log(duration.asDays());
    
    
    var duration = moment.duration(endDate.diff(startDate));
    console.log(duration.asDays());
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js"></script>

    如果您只对以天计算的差异感兴趣,则此代码会更短:

    var startDate = moment("2019-06-20", "YYYY-MM-DD");
    var endDate = moment("2019-06-24", "YYYY-MM-DD");
    var diff  = startDate.diff(endDate, 'days');
    console.log(diff);
    
    
    var diff  = endDate.diff(startDate, 'days');
    console.log(diff);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js"></script>

    日期本身肯定有问题。
    事实上,这就是你解析日期字符串的方式

    // This is parsed as the 19th day of 6th month in year 2020
    var startDate = moment("20/06/2019", "YYYY-MM-DD");
    // This is parsed as the 19th day of 6th month in year 2024
    var endDate = moment("24/06/2019", "YYYY-MM-DD");
    var diff  = endDate.diff(startDate, 'days');
    console.log({"start": startDate, "end": endDate, "diff": diff});
    
    // You either need to change the date strings or the format strings
    var startDate = moment("20/06/2019", "DD/MM/YYYY");
    var endDate = moment("24/06/2019", "DD/MM/YYYY");
    var diff  = endDate.diff(startDate, 'days');
    console.log({"start": startDate, "end": endDate, "diff": diff});
    
    
    // You either need to change the date strings or the format strings
    var startDate = moment("2019-06-20", "YYYY-MM-DD");
    var endDate = moment("2019-06-24", "YYYY-MM-DD");
    var diff  = endDate.diff(startDate, 'days');
    console.log({"start": startDate, "end": endDate, "diff": diff});
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js"></script>

    【讨论】:

    • "你的代码应该可以正常工作"它没有。日期错误。
    • 不,日期字符串从一开始就在那里。在发布问题 3 分钟后检查 my comment。我知道编辑历史忽略了最近的编辑,但我知道我立即看到了日期。
    • 在第一次写作时没有以格式显示的日期。
    • 那我怎么能在我的评论中包含 OP 使用的确切日期?
    • 这是一个假设。我做了同样的假设,并尝试了我假设的日期格式之间的天数差异,它与 OP 中计算的差异相匹配。我假设! :)
    【解决方案3】:

    您的日期无效,您指定的开始日期是“20/06/2019”,它是“DD/MM/YYYY”的模板,但告诉时刻使用“YYYY-MM-DD”的模板。

    你只需要替换你传递给 moment 的模板,这里有一个更简洁的方法:

    const DEFAULT_DATE_TEMPLATE = "DD/MM/YYYY";
    
    const getDaysBetweenDates = (date1, date2, dateTemplate = DEFAULT_DATE_TEMPLATE) => {
        const start = moment(date1, dateTemplate);
        const end = moment(date2, dateTemplate);
        const duration = moment.duration(start.diff(end));
        const daysDiff = duration.asDays();
    
        // for your example you will get -4, abs will make it into 4 for you
        return Math.abs(daysDiff); 
    }
    
    
    const myDiff = getDaysBetweenDates('20/06/2019', '24/06/2019');
    console.log(myDiff); // 4
    
    // or if you rather keep your other template
    const myDiff2 = getDaysBetweenDates('2019-06-20', '2019-06-24', 'YYYY-MM-DD');
    console.log(myDiff2); // 4
    

    【讨论】:

      猜你喜欢
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 2019-09-27
      相关资源
      最近更新 更多