如何计算两个日期之间的天数
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.floor
、Math.ceil
或Math.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'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js"></script>
【讨论】:
【参考方案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);
【讨论】:
以上是关于如何计算两个日期之间的天数的主要内容,如果未能解决你的问题,请参考以下文章