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

JavaScript로 특정 날짜(일·월·연도)의 요일 구하는 방법

문제 개요

이번 글에서는 일(day), 월(month), 연도(year) 세 가지 인수를 받아 해당 날짜가 무슨 요일인지 계산하는 JavaScript 함수를 만들어 보겠습니다.

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

day = 15,
month = 8,
year = 1993

출력 결과

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

const output = 'Sunday'; // 일요일

구현 코드

const dayOfTheWeek = (day, month, year) => {
  // JS의 월(month)은 0부터 시작하므로 1을 빼서 전달
  return dayOfTheWeekJS(day, month - 1, year);
}

function dayOfTheWeekJS(day, month, year) {
  const DAYS = [
    'Sunday',    // 일요일
    'Monday',    // 월요일
    'Tuesday',   // 화요일
    'Wednesday', // 수요일
    'Thursday',  // 목요일
    'Friday',    // 금요일
    'Saturday',  // 토요일
  ];
  const DAY_1970_01_01 = 4; // 1970년 1월 1일은 목요일(인덱스 4)
  let days = day - 1;
  while (month - 1 >= 0) {
    days += daysInMonthJS(month - 1, year);
    month -= 1;
  }
  while (year - 1 >= 1970) {
    days += daysInYear(year - 1);
    year -= 1;
  }
  return DAYS[(days + DAY_1970_01_01) % DAYS.length];
}

function daysInMonthJS(month, year) {
  const days = [
    31, // 1월
    28 + (isLeapYear(year) ? 1 : 0), // 2월 (윤년 처리)
    31, // 3월
    30, // 4월
    31, // 5월
    30, // 6월
    31, // 7월
    31, // 8월
    30, // 9월
    31, // 10월
    30, // 11월
    31, // 12월
  ];
  return days[month];
}

function daysInYear(year) {
  return 365 + (isLeapYear(year) ? 1 : 0);
}

function isLeapYear(year) {
  return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;
}

console.log(dayOfTheWeek(15, 8, 1993));

코드 설명

핵심 아이디어는 주어진 날짜까지 총 며칠이 지났는지 세는 것입니다. 이를 위해 유닉스 시간(Unix Epoch)의 시작점인 1970년 1월 1일(목요일)을 기준으로 삼습니다.

  • 완전히 지난 연도: 각 연도의 전체 일수를 더합니다. 이때 윤년 여부를 반영해 365일 또는 366일로 계산합니다.

  • 완전히 지난 달: 해당 연도 내에서 지나간 달들의 일수를 더합니다. 2월은 윤년이면 29일로 처리됩니다.

  • 남은 일수: 현재 달에서 경과한 일수(day - 1)를 더합니다.

마지막으로 총 일수를 7로 나눈 나머지를 구하고, 1970년 1월 1일이 목요일이라는 기준값(인덱스 4)을 더해 요일 배열의 인덱스를 계산하면 원하는 요일을 얻을 수 있습니다.

실행 결과

콘솔에는 다음과 같이 출력됩니다 −

Sunday

추가 팁

실무에서는 위처럼 직접 계산하기보다 내장 Date 객체를 활용하는 것이 더 간단하고 안전합니다. 예를 들어 new Date(1993, 7, 15).getDay()를 호출하면 요일 인덱스(0~6)를 바로 얻을 수 있으며, 시간대 관련 오류도 피할 수 있습니다. 다만 날짜 계산의 동작 원리를 이해하는 데는 위 알고리즘이 좋은 학습 예제가 됩니다.