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

Posted

技术标签:

【中文标题】如何计算两个日期之间的天数【英文标题】: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 评论就是答案。这就是为什么有些人会问为什么我们处于二十一世纪。 【参考方案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

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

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

    使用a/b.startOf('day') 和/或a/b.endOf('day') 强制差异在“结束”处包含或排除(正如@kotpal 在 cmets 中所建议的那样)。 设置第三个参数true 以获得浮点差异,然后您可以根据需要使用Math.floorMath.ceilMath.round。 选项 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);

【讨论】:

以上是关于如何计算两个日期之间的天数的主要内容,如果未能解决你的问题,请参考以下文章

C++ 计算两个日期之间的天数

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

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

如何计算两个日期之间的天数? [复制]

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

关于如何通过日期计算天数