Search

달력[1단계]

대분류
STEP06 이벤트응용
소분류
이벤트응용

영상

개념

1. 윤년과 평년 (1) 평년 : 2월이 28일까지 (2) 윤년 : 2월이 29일까지 2. 윤년이 생기는 이유 지구 공전 속도 : 29.8km/s 지구 공전 시간 : 365.2420.242일 x 24= 5.808시간(5시간) 0.808시 x 60= 48.48(48) = 3655시간 48= 3653. 그레고리 규칙 * 그레고리력은 일요일부터 시작해 토요일로 끝난다. [규칙1] 4년마다 2월에 하루를 추가한다. [문제1] 천년 후에 8일이 추가된다. 4년마다 x 1일 추가 => 1년마다 x 0.25일 추가 365.25 - 365.242 ---------------- 매년 0.008일의 오차가 발생한다. [규칙2] 100년마다 규칙1을 무시한다. [문제2] 천년 후에 10일이 감소된다. [규칙3] 400년마다 규칙2를 무시한다. [결론3] +8(규칙1) -10(규칙2) +2(규칙3) 4. 달력 계산 (0) 111일은 월요일이다. (1) 위 시작일부터 작년까지 day구하기 = 2022* 365(2) 작년까지 윤년일 추가하기 규칙1) 4년마다 +1일 규칙2) 100년마다 -1일 규칙3) 400년마다 +1(3) 올해 지난달까지의 day 구하기 (4), 올해가 윤년인지 확인해 윤년이면 2월달 달력 변경하기 예) 1000년까지 1) 4의 배수이면 +1 2) 100의 배수이면 -1 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000 3) 400의 배수이면 +1 규칙3이 생긴이유는 규칙2 때문이다. 규칙2가 생긴이유는 규칙1 때문이다. 때문에 규칙3부터 아래로 규칙1까지 계산한다. 1) 400의 배수이면 +1 2) 1번을 제외한 년도 중에 100의 배수가 아니면서 4의배수이면 +1 (5) 이번달 표시를 위해 1을 추가로 더한다.
Java
복사
<!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> #target { margin: 0 auto; display: table; } td { border: 1px solid black; width: 50px; height: 50px; text-align: center; } </style> </head> <body> <div id="target"></div> <script> /* [작년까지의 윤년 공식] 1. 4의 배수이면 +1 2. 100의 배수이면 -1 3. 400의 배수이면 +1 [올해 윤년 공식] 1. 400의 배수이면 +1 2. 1번의 제외한 수 중에 100의 배수가 아니면서 4의 배수이면 +1 [달력 계산] 0. 1년 1월 1일은 월요일이다. 1. 작년까지 day를 구한다. 2. 작년까지의 윤년을 추가한다. 3. 올해 지난달까지의 day를 구한다. 4. 올해가 윤년인지 판단해 2월 달력을 변경한다. 5. 이번달 표시를 위해 1을 추가로 더한다. */ let total = 0; let thisYear = 2023; let lastYear = thisYear - 1; // 1. 작년까지 day를 구한다. total += lastYear * 365; // 2. 작년까지의 윤년을 추가한다. total += parseInt(lastYear / 400); total -= parseInt(lastYear / 100); total += parseInt(lastYear / 4); // 3. 올해 지난달까지의 day를 구한다. // 4. 올해가 윤년인지 판단해 2월 달력을 변경한다. let monthList = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; if(thisYear % 400 == 0) { monthList = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; } else if(thisYear % 100 != 0 && thisYear % 4 == 0) { monthList = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; } let thisMonth = 5; // 6월 for(let i=0; i<thisMonth; i++) { total += monthList[i]; } // 5. 이번달 표시를 위해 1을 추가로 더한다. total += 1; // 테이블 그리기 let $target = document.querySelector("#target"); let $table = document.createElement("table"); for(let i=0; i<7; i++) { let $tr = document.createElement("tr"); for(let j=0; j<7; j++) { let $td = document.createElement("td"); $tr.append($td); } $table.append($tr); } $target.append($table); // 요일 출력 let dayList = ["일", "월", "화", "수", "목", "금", "토"]; for(let i=0; i<dayList.length; i++) { $table.children[0].children[i].innerText = dayList[i]; } // 이번 달의 시작 요일 구하기 let dayIndex = total % 7; // 날짜 출력 let row = 1; for(let i=0; i<monthList[thisMonth]; i++) { let index = (i + dayIndex) % 7; $table.children[row].children[index].innerText = i + 1; if(index == 6) { row += 1; } } </script> </body> </html>
JavaScript
복사