티스토리 뷰
<html>
<head>
<script language="JavaScript">
function showCalendar(y, m) {
var text = '<table>\n<tr><td colspan=7 style="text-align:center">';
text += '<span onclick="showCalendar('+(y-1)+','+m+')"> Y- </span>';
text += '<span onclick="showCalendar('+(m==1?(y-1)+','+12:y+','+(m-1))+')"> M- </span>';
text += '[' + y + '/' + ((m < 10) ? ('0' + m) : m) + ']';
text += '<span onclick="showCalendar('+(m==12?(y+1)+','+1:y+','+(m+1))+')"> M+ </span>';
text += '<span onclick="showCalendar('+(y+1)+','+m+')"> Y+ </span>';
text += '</td>';
var d1 = (y+(y-y%4)/4-(y-y%100)/100+(y-y%400)/400
+m*2+(m*5-m*5%9)/9-(m<3?y%4||y%100==0&&y%400?2:3:4))%7;
for (i = 0; i < 42; i++) {
if (i%7==0) text += '</tr>\n<tr>';
if (i < d1 || i >= d1+(m*9-m*9%8)/8%2+(m==2?y%4||y%100==0&&y%400?28:29:30))
text += '<td> </td>';
else
text += '<td' + (i%7 ? '' : ' style="color:red;"') + '>' + (i+1-d1) + '</td>';
}
document.getElementById('calendarDiv').innerHTML = text + '</tr>\n</table>';
}
</script>
</head>
<body onload="showCalendar(2006,8)">
<div id="calendarDiv" style="font-family:Gulim;font-size:9pt;"></div>
</body>
</html>
소스 설명을 조금 하자면,
y-1+(y-1-(y-1)%4)/4-(y-1-(y-1)%100)/100+(y-1-(y-1)%400)/400
은 (1년부터 (y-1)년까지의 각 해의 날짜 수 - 364)를 모두 더한 것이고,
m*2+(m*5-m*5%9)/9-(m>2?y%4||y%100==0&&y%400?4:3:2)
은 (y년 1월부터 y년 (m-1)월까지 각 월의 날짜 수 - 28)을 모두 더한 것입니다.
그런데 364=7*52, 28=7*4 이므로 364나 28을 더하거나 빼도 7로 나눈
나머지에는 변함이 없습니다. 즉, 위의 두 줄을 더한 값을 7로 나눈 나머지는,
1년 1월 1일부터 y년 (m-1)월 말일까지의 날짜 수를 7로 나눈 나머지와 같습니다.
따라서 위의 두 식을 더한 다음 7로 나눈 나머지를 구하면 y년 m월 1일이 무슨 요일인지
알 수 있습니다. 다시 말해서 각 요일에 따라서 0~6 사이의 숫자가 나옵니다. 그런데
y=2006, m=1을 집어넣어 보면 6이 나옵니다. 따라서 실제 2006년 1월 1일은
일요일이므로, 식의 결과가 6이 나오면 일요일, 0이 나오면 월요일, 1이 나오면 화요일···
등이라는 것을 알 수 있습니다.
그런데 6=일, 0=월, 1=화··· 보다는 0=일, 1=월, 2=화··· 이렇게 한칸씩 쉬프트하는
것이 좀 더 사용하기 편리합니다. 이렇게 요일을 나타내는 숫자를 1씩 쉬프트하기
위해서는 전체 식을 7로 나누기 전에 1을 더해주면 되는데, 운좋게도 식 첫 부분에
y-1이 있으므로 y-1 대신 그냥 y를 쓰면 됩니다. 이렇게 해서,
(y+(y-1-(y-1)%4)/4-(y-1-(y-1)%100)/100+(y-1-(y-1)%400)/400
+m*2+(m*5-m*5%9)/9-(m>2?y%4||y%100==0&&y%400?4:3:2))%7;
을 계산하면 y년 m월 1일의 요일(0=일요일, 1=월요일···)을 구할 수 있습니다.
소스에서 var d1 = 으로 시작하는 줄은 위의 식을 조금 더 압축한 것입니다.
또, 소스의 for문 안쪽에서 두번째 if절의
(m*9-m*9%8)/8%2+(m==2?y%4||y%100==0&&y%400?28:29:30)
은 y년 m월의 날짜 수입니다.
[출처] [JavaScript] 자바스크립트 달력 소스|작성자 원숭이
'Project > JavaScript' 카테고리의 다른 글
자바스크립트 정규 표현식 (0) | 2008.07.26 |
---|---|
자바스크립트 쿠키처리 하기 (0) | 2008.07.26 |
자바스크립트 정규 표현식 (0) | 2008.07.26 |
[자바스크립트]substr 과 substring의 차이점 (0) | 2008.07.26 |
JavaScript Tip (0) | 2008.07.26 |
- Total
- Today
- Yesterday
- letsencrypt
- Letsencrypt+nginx
- Letsencrypt wildcard auto renew
- 마이바티스CamelCase
- 마이바티스
- Letsencrypt wildcard
- camelcase
- SSL
- Intellj들여쓰기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |