두 날짜 사이의 일 수를 계산하는 방법


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 일입니다.
Supr

차이를 가져 가면서 나는 시작 날짜도 고려하고 싶습니다 ....
Vaibhav Deshmukh

17
글쎄 ... 왜 대답에 1을 추가하지 않습니까?
Pointy

문제 (문제가있는 경우)는 기술적이지 않은 기능입니다. @Pointy 코멘트가 답입니다. 그렇기 때문에 일부 사람들은 왜 우리가 XXI 세기에 있는지 묻습니다.
Leandro

답변:


666

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

순간 문서에서 :

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에 의해 제안)에 포함 또는 독점 할은 diff를 강제로.
  2. 설정 세 번째 인수는 true당신이 다음 할 수있는 부동 소수점 사랑하는 얻기 위해 Math.floor, Math.ceil또는 Math.round으로 필요합니다.
  3. 옵션 2는 'seconds'대신 'days'에을 나누고 나눠서 수행 할 수도 있습니다 24*60*60.

30
moment.js는 a <b이면 음수 값을 제공합니다. 보다 강력한 계산은 다음과 같습니다. 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 "). return b.diff (a, 'days') <= 7; 둘 다 true를 반환합니다. diff에 시간 구성 요소를 포함시키는 방법이 있습니까?
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

@Vincent 당신이 이것을 잘못 사용하고있는 것 같습니다. 이것은 a 1가 손실 되는 @Supr의 답변과 비교하여 결과가 더 정확한 해결책이라는 것이 확실합니다.
Nwawel A Iroume

15

시험:

//Difference in days

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

나는 그것이 기본적으로 맞다고 생각하지만 OP의 내용과 본질적으로 동일하지 않습니까?
Pointy

그가 쓴 방식 때문에 나는 눈치 채지 못했지만, 그래, 거의! : P
Richard

5
나는 마법의 숫자를 좋아하지 않습니다 .. 그 숫자가 자체 설명 식으로 나뉘면 더 좋을 것입니다
vsync

7

moment.js를 사용하여 이것을 시도하십시오 (자바 스크립트에서 날짜 연산을 계산하는 것은 매우 쉽습니다)

firstDate.diff (secondDate, 'days', false); // 분수 값의 경우 true | false

결과는 정수로 일 수를 제공합니다.


여기 서명이 있습니다 : moment (). diff (모멘트 | 문자열 | 번호 | 날짜 | 배열, 문자열, 부울);
수밋

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 i에는 두 개의 입력 텍스트 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" })

자바

날짜 사용에서 숫자를 계산

    $("#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/ 을 추가하는 것을 잊지 마십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.