【问题标题】:How to calculate number of days between two dates如何计算两个日期之间的天数
【发布时间】:2012-02-26 03:30:41
【问题描述】:

我有两个来自日期选择器控件的输入日期。我选择了开始日期 2/2/2012 和结束日期 2/7/2012。我为此编写了以下代码。

我应该得到 6 的结果,但我得到 5。

function SetDays(invoker) {   
    var start = $find('<%=StartWebDatePicker.ClientID%>').get_value();
    var end = $find('<%=EndWebDatePicker.ClientID%>').get_value();

    var oneDay=1000 * 60 * 60 * 24;
    var difference_ms = Math.abs(end.getTime() - start.getTime())
    var diffValue = Math.round(difference_ms / oneDay);
}

谁能告诉我怎样才能得到确切的区别?

【问题讨论】:

  • 为什么要得到 result = 6??? 07 - 02 = 05 天....
  • 但是2到7天的范围是2,3,4,5,6,7 = 6天。
  • 在考虑差异的同时,我也想考虑开始日期....
  • 嗯...为什么不给答案加 1?
  • 问题(如果有问题的话)是功能性的,而不是技术性的。 @Pointy 评论就是答案。这就是为什么有些人会问为什么我们处于二十一世纪。

标签: javascript


【解决方案1】:

http://momentjs.com/https://date-fns.org/

来自 Moment 文档:

var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days')   // =1

或包括开头:

a.diff(b, 'days')+1   // =2

避免手动处理时间戳和时区。

根据您的具体用例,您可以

  1. 使用a/b.startOf('day') 和/或a/b.endOf('day') 强制差异在“结束”处包含或排除(正如@kotpal 在 cmets 中所建议的那样)。
  2. 设置第三个参数true 以获得浮点差异,然后您可以根据需要使用Math.floorMath.ceilMath.round
  3. 选项 2 也可以通过获取 'seconds' 而不是 'days' 然后除以 24*60*60 来完成。

【讨论】:

  • moment.js 如果 a Math.abs(a.diff(b, 'days'))+1
  • 请注意忽略时间部分 - 否则您会在相同日期但不同时间得到不同的结果(例如来自日期选择器控件)。在执行差异(或任何其他对日期/时刻对象的时间部分敏感的操作)之前,使用 moment(someDate).startOf('day') 将时间部分显式设置为 00:00:00 跨度>
  • 这可行,但它没有考虑时间组件。试图区分以下两对: (a="2017-12-24T00:00:00Z" 和 "b=2017-12-31T23:59:59Z") 和 (a="2017-12-24T23:00 :00Z" 和 b="2017-12-31T23:59:59Z")。返回 b.diff(a, 'days')
  • +1 用于 startOf() 和 endOf()。我已经使用这个库几年了,以前从未注意到它们。我总是 +1。
  • 请注意startOf 会改变这一刻。如果你不想这样,那就a.clone().startOf('day').diff(b.clone().startOf('day'))
【解决方案2】:

如果您使用moment.js,您可以轻松完成。

var start = moment("2018-03-10", "YYYY-MM-DD");
var end = moment("2018-03-15", "YYYY-MM-DD");

//Difference in number of days
moment.duration(start.diff(end)).asDays();

//Difference in number of weeks
moment.duration(start.diff(end)).asWeeks();

如果您想找出给定日期和当前日期之间的天数差异(忽略时间),请确保从当前日期的时刻对象中删除时间,如下所示

moment().startOf('day')

查找给定日期和当前日期之间的天数差异

var given = moment("2018-03-10", "YYYY-MM-DD");
var current = moment().startOf('day');

//Difference in number of days
moment.duration(given.diff(current)).asDays();

【讨论】:

  • asDays() 返回了一些带小数的值。我使用current.diff(given, 'days'),所以它会四舍五入。
  • @Vincent 看来您的使用方式错误。与@Supr 的答案相比,这绝对是更干净的解决方案,其中1 丢失了
【解决方案3】:

试试:

//Difference in days

var diff =  Math.floor(( start - end ) / 86400000);
alert(diff);

【讨论】:

  • 我认为这基本上是对的,但它与OP中的内容本质上不一样吗?
  • 因为他写的方式我没有注意到,但是,是的,差不多! :P
  • 我不喜欢幻数..如果把这个数字分解成一个不言自明的方程会更好
  • 这个计算在跨越夏令时的边界时是错误的,因为那些日子有 23 小时或 25 小时。
【解决方案4】:

使用 moment.js 试试这个(在 javascript 中计算日期操作非常容易)

firstDate.diff(secondDate, 'days', false);// true|false 为小数值

结果会给你整数天数。

【讨论】:

  • 这里是签名:moment().diff(Moment|String|Number|Date|Array, String, Boolean);
【解决方案5】:

这对我有用:

const from = '2019-01-01';
const to   = '2019-01-08';

Math.abs(
    moment(from, 'YYYY-MM-DD')
      .startOf('day')
      .diff(moment(to, 'YYYY-MM-DD').startOf('day'), 'days')
  ) + 1
);

【讨论】:

    【解决方案6】:

    我使用 Moment.js 在 ES6 中制作了一个快速可重用的函数。

    const getDaysDiff = (start_date, end_date, date_format = 'YYYY-MM-DD') => {
      const getDateAsArray = (date) => {
        return moment(date.split(/\D+/), date_format);
      }
      return getDateAsArray(end_date).diff(getDateAsArray(start_date), 'days') + 1;
    }
    
    console.log(getDaysDiff('2019-10-01', '2019-10-30'));
    console.log(getDaysDiff('2019/10/01', '2019/10/30'));
    console.log(getDaysDiff('2019.10-01', '2019.10 30'));
    console.log(getDaysDiff('2019 10 01', '2019 10 30'));
    console.log(getDaysDiff('+++++2019!!/###10/$$01', '2019-10-30'));
    console.log(getDaysDiff('2019-10-01-2019', '2019-10-30'));
    console.log(getDaysDiff('10-01-2019', '10-30-2019', 'MM-DD-YYYY'));
    
    console.log(getDaysDiff('10-01-2019', '10-30-2019'));
    console.log(getDaysDiff('10-01-2019', '2019-10-30', 'MM-DD-YYYY'));
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js"&gt;&lt;/script&gt;

    【讨论】:

      【解决方案7】:

      您也可以使用以下代码:moment("yourDateHere", "YYYY-MM-DD").fromNow()。这将计算今天与您提供的日期之间的差异。

      【讨论】:

        【解决方案8】:
        // today
        const date = new Date();
        
        // tomorrow
        const nextDay = new Date(new Date().getTime() + 24 * 60 * 60 * 1000);
        
        // Difference in time
        const Difference_In_Time = nextDay.getTime() - date.getTime();
        
        // Difference in Days 
        const Difference_In_Days = Difference_In_Time / (1000 * 3600 * 24);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-07
          • 2015-02-26
          • 2019-09-27
          相关资源
          最近更新 更多