如何计算两个日期之间的天数

IT技术 javascript
2021-01-14 21:03:37

我有两个来自 Date Picker 控件的输入日期。我选择了开始日期 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);
}

谁能告诉我如何才能得到确切的区别?

6个回答

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 在评论中所建议的)。
  2. 设置第三个参数true来获得,然后可以浮点差异Math.floorMath.ceilMath.round根据需要。
  3. 选项 2 也可以通过获取'seconds'而不是'days'然后除以来完成24*60*60
请注意,startOf那一刻发生变化。如果你不想那样,那就去做a.clone().startOf('day').diff(b.clone().startOf('day'))
2021-03-24 21:03:37
这有效,但没有考虑时间组件。尝试区分以下两对:(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') <= 7; 两者都返回true。有没有办法在差异中包含时间组件?
2021-03-31 21:03:37
如果 a < b,moment.js 将给出负值。因此,更稳健的计算将是: Math.abs(a.diff(b, 'days'))+1
2021-04-07 21:03:37
请注意忽略时间部分 - 否则您将获得相同日期但时间不同的不同结果(例如来自日期选择器控件)。在执行差异(或对日期/时刻对象的时间部分敏感的任何其他操作)之前,使用 moment(someDate).startOf('day') 将时间部分显式设置为 00:00:00
2021-04-08 21:03:37
+1 用于 startOf() 和 endOf()。我已经使用这个库几年了,以前从未注意到它们。我总是+1。
2021-04-11 21:03:37

如果您使用的是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();
@Vincent 似乎您以错误的方式使用它。1丢失a 的@Supr 的答案相比,这绝对是更干净的解决方案,结果是正确的
2021-03-18 21:03:37
asDays() 返回了一些带小数的值。我使用current.diff(given, 'days')所以它四舍五入。
2021-03-31 21:03:37

尝试:

//Difference in days

var diff =  Math.floor(( start - end ) / 86400000);
alert(diff);
我不喜欢魔术数字..如果把这个数字分解成一个不言自明的方程会更好
2021-03-23 21:03:37
我认为这基本上是正确的,但它与 OP 中的内容本质上不一样吗?
2021-03-27 21:03:37
因为他写的方式我没有注意到,但是,是的,几乎!:P
2021-03-28 21:03:37
当跨越夏令时边界时,这种计算是错误的,因为那些日子有 23 小时或 25 小时。
2021-03-28 21:03:37

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

firstDate.diff(secondDate, 'days', false); // true|false 表示分数

结果将为您提供整数天数。

这是签名:moment().diff(Moment|String|Number|Date|Array, String, Boolean);
2021-03-29 21:03:37

这对我有用:

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