영상
개념
1. 윤년과 평년
(1) 평년 : 2월이 28일까지
(2) 윤년 : 2월이 29일까지
2. 윤년이 생기는 이유
지구 공전 속도 : 29.8km/s
지구 공전 시간 : 365.242일
0.242일 x 24시 = 5.808시간(5시간)
0.808시 x 60분 = 48.48분(48분)
= 365일 5시간 48분
= 365일
3. 그레고리 규칙
* 그레고리력은 일요일부터 시작해 토요일로 끝난다.
[규칙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) 1년 1월 1일은 월요일이다.
(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
복사