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


282

我有两个输入日期来自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 ???
07-02

1
但是从2到7的天数范围是2,3,4,5,6,7 = 6天。
2012年

同时采取差异我要考虑的开始日期还...
Vaibhav的德希穆克

17
好吧...为什么不将答案加1?
Pointy '02

问题(如果有问题的话)是功能性的,而不是技术性的。@Pointy评论是答案。这就是为什么有人问我们为什么进入二十一世纪的原因。
莱安德罗

Answers:


666

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')强制diff在“端点”处包含或排除(如@kotpal在评论中建议)。
  2. 设置第三个参数true来获得,然后可以浮点差异Math.floorMath.ceilMath.round根据需要。
  3. 选项2也可以通过'seconds'代替,'days'然后除以来实现24*60*60

30
如果a <b,moment.js将给出负值。因此,更可靠的计算方法是: Math.abs(a.diff(b, 'days'))+1
Vinay Sahni

18
请注意忽略时间部分-否则您将在同一日期但具有不同时间(例如,从日期选择器控件中)获得不同的结果。在执行diff(或对Date / moment对象的时间部分敏感的任何其他操作)之前,使用moment(someDate).startOf('day')将时间部分显式设置为00:00:00
kotpal

这可行,但是没有考虑时间因素。尝试在以下两对之间进行区分:(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。有没有办法在差异中包含时间成分?
Roobie

1
为startOf()和endOf()+1。我使用这个库已经有几年了,以前从未注意到它们。我总是+1。
Mike Devenney

3
请注意,这会startOf改变瞬间。如果您不希望这样做,请执行a.clone().startOf('day').diff(b.clone().startOf('day'))
HRJ

53

如果您正在使用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();

2
asDays()向我返回了一些带有小数的值。我用current.diff(given, 'days')它来四舍五入。
文森特

@Vincent似乎您使用的是错误的方式。与@Supr的答案相比,这绝对是更干净的解决方案,答案是其中的a 1丢失了
Nwawel A Iroume

15

尝试:

//Difference in days

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

我认为这基本上是正确的,但它与OP中的内容基本不相同吗?
Pointy '02

因为他写的方式,我没有注意到,但是,是的,差不多!:P
理查德(Richard)

5
我不喜欢魔幻数字 ..如果那个数字分解成一个不言自明的方程,那就更好了
vsync

7

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

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

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


这是签名:moment()。diff(Moment | String | Number | Date | Array,String,Boolean);
Sumit

1

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


1

这对我有用:

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


1

我使用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>


-1

MVC我有两个输入文本1:天数2:日期时间选择器

 @Html.TextBox("HeaderINVID", null, new { @id = "HeaderINVID", @type = "number", @class = "form-control", autocomplete = "off", placeholder = "Day Count " })

  @Html.TextBox("HeaderINVDT", null, new { id = "HeaderINVDT", @class = "form-control format-picker", autocomplete = "off", placeholder = " Date" })

javascipt

从日期使用中计算数字

    $("#HeaderINVID").bind("keyup", function (e) {
        var INVID = $("#HeaderINVID").val();
        var date = moment()
            .add(INVID, 'd')
            .toDate(); 
        $("#HeaderINVDT").val(moment(date).format('YYYY-MM-DD')) ;
    })

计算两个日期之间的天数

  $("#HeaderINVDT").bind('change', function (e) {
        var StDT = moment($("#HeaderINVDT").val()).startOf('day');
        var NODT = moment().startOf('day');
        $("#HeaderINVID").val(StDT.diff(NODT, 'days'));
    })

不要忘记添加 http://momentjs.com/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.