Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

자바스크립트로 두 날짜 사이의 일 수 계산하기

이번 글에서는 'YYYY-MM-DD' 형식의 두 날짜를 각각 첫 번째와 두 번째 인수로 전달받아, 두 날짜 사이의 일 수를 계산하여 반환하는 자바스크립트 함수를 작성해 보겠습니다.

예를 들어 다음과 같은 입력이 주어졌을 때 −

const str1 = '2020-05-21';
const str2 = '2020-05-25';

함수는 아래와 같은 결과를 반환해야 합니다.

const output = 4;

예제 코드

const str1 = '2020-05-21';
const str2 = '2020-05-25';

const daysBetweenDates = (str1, str2) => {
    // 해당 시점까지의 윤년 개수를 계산하는 함수
    const leapYears = (year, month) => {
        if (month <= 2) {
            --year;
        }
        let floor = Math.floor;
        return floor(year / 400) + floor(year / 4) - floor(year / 100);
    };

    // 월별 일수 배열을 누적합으로 변환
    let monthDays = [0, 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30];
    for (let i = 1; i < monthDays.length; ++i) {
        monthDays[i] += monthDays[i - 1];
    }

    // 기준일(서기 1년 1월 1일)로부터 경과한 총 일수 계산
    let days = (year, month, d) =>
        (year * 365) + leapYears(year, month) + monthDays[month] + d;

    let p = days(...str1.split('-').map(Number));
    let q = days(...str2.split('-').map(Number));

    // 두 날짜의 총 일수 차이의 절댓값 반환
    return Math.abs(p - q);
};

console.log(daysBetweenDates(str1, str2));

코드 설명

  • leapYears 함수: 그레고리력 규칙(4년마다 윤년, 100년 단위는 제외, 400년 단위는 다시 윤년)에 따라 특정 연도까지의 윤년 개수를 계산합니다. 2월 이전인 경우 현재 연도가 아직 완료되지 않았으므로 1을 빼줍니다.
  • monthDays 배열: 각 월의 일수를 저장한 뒤 반복문으로 누적합으로 변환하여, 특정 월까지의 총 일수를 빠르게 구할 수 있도록 합니다.
  • days 함수: 연도 × 365일에 윤년 보정치와 월·일 정보를 더해, 서기 원년부터 해당 날짜까지의 총 일수를 구합니다.
  • Math.abs(p - q): 두 날짜의 순서와 관계없이 항상 양수인 일 수 차이를 반환합니다.

출력 결과

콘솔에 출력되는 결과는 다음과 같습니다.

4

참고: Date 객체를 활용한 더 간단한 방법

위 방식은 윤년 계산 로직을 직접 구현해야 하지만, 자바스크립트 내장 Date 객체를 사용하면 훨씬 간결하게 처리할 수 있습니다.

const daysBetween = (dateStr1, dateStr2) => {
    const date1 = new Date(dateStr1);
    const date2 = new Date(dateStr2);
    const diffMs = Math.abs(date2 - date1); // 밀리초 단위 차이
    return diffMs / (1000 * 60 * 60 * 24);  // 일 단위로 변환
};

console.log(daysBetween('2020-05-21', '2020-05-25')); // 4

두 날짜 객체의 차이는 밀리초 단위로 계산되므로, 하루(24시간)에 해당하는 밀리초 값으로 나누어 일 수를 구하면 됩니다. 실무에서는 이 방식이 더 널리 사용됩니다.