1. 테이블 행 수 문제
날짜 테이블을 표시하려면 먼저 테이블에 행과 열이 몇 개 있는지 알아야 합니다. 열의 개수는 일요일부터 총 7개입니다(달력의 첫 번째 열은 일요일입니다.) ) 토요일까지. 행 번호 문제를 풀기 전에 먼저 이번 달의 첫 번째 날이 무슨 요일인지 알아야 합니다. 왜냐하면 매월 첫 번째 날은 달력상 항상 일요일부터 시작되지 않기 때문입니다. 첫 번째 날은 금요일일 수도 있고 토요일일 수도 있습니다. 불확실하므로 1번의 왼쪽 부분을 빈 형태로 대체해야 합니다. 그러면 이를 대체하려면 몇 개의 빈 테이블을 사용해야 합니까? 이 메소드는 배열에 숫자를 반환합니다. 0은 일요일을 나타내고, 1은 화요일을 나타냅니다. 에. . 따라서 매월 1일이 금요일이면 왼쪽에 5개의 빈 테이블이 필요합니다. 그런 다음 한 달이 31일인 경우 테이블 행의 최종 수는 다음과 같습니다.
var tr_nums = Math.ceil((5 + 31)/7)
물론 매달 31일이 있는 것은 아니므로 12개월을 포함하는 배열을 만들어야 하며, 각 요소는 각 달에 포함된 일 수를 나타냅니다. 하지만 윤년의 2월은 29일이지만 평년의 2월은 28일밖에 없습니다. 따라서 배열을 만들기 전에 윤년을 결정하는 함수를 만들어야 합니다.
//如果当前年份能被4整除但是不能被100整除或者能被400整除,即可确定为闰年,返回1,否则返回0 function isLeap(year) { return year % 4 == 0 ? (year % 100 != 0 ? 1 : (year % 400 == 0 ? 1 : 0)) : 0; }
그런 다음 월 배열을 만듭니다.
var days_per_month = new Array(31, 28 + isLeap(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); 这样就能保证无论是平年还是闰年都会取出正确的天数,下面的代码用于获取今天的相关信息: var today = new Date(), //获取当前日期 y = today.getFullYear(), //获取日期中的年份 m = today.getMonth(), //获取日期中的月份(需要注意的是:月份是从0开始计算,获取的值比正常月份的值少1) d = today.getDate(), //获取日期中的日(方便在建立日期表格时高亮显示当天) firstday = new Date(y, m, 1), //获取当月的第一天 dayOfWeek = firstday.getDay(), //判断第一天是星期几(返回[0-6]中的一个,0代表星期天,1代表星期一,以此类推) days_per_month = new Array(31, 28 + isLeap(y), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31), //创建月份数组
마지막으로 이번 달에 필요한 테이블의 행 수를 얻을 수 있습니다.
var str_nums = Math.ceil((dayOfWeek + days_per_month[m]) / 7) //날짜 테이블에 필요한 행 수 결정
2. 달력 양식 인쇄
테이블 자체는 2차원 배열이므로 for master가 두 개의 루프를 실행하게 하면 코드는 다음과 같습니다.
for (i = 0; i < str_nums; i += 1) { //第一层for循环创建tr标签 document.write('<tr>'); for (k = 0; k < 7; k++) { //第二层for循环创建td标签 var idx = 7 * i + k; //为每个表格创建索引,从0开始 var date = idx - dayOfWeek + 1; //将当月的1号与星期进行匹配 //do something else } document.write('</tr>'); }
3. 전체 js 캘린더 코드가 첨부되어 있습니다
<script> //判断当前年份是否是闰年(闰年2月份有29天,平年2月份只有28天) function isLeap(year) { return year % 4 == 0 ? (year % 100 != 0 ? 1 : (year % 400 == 0 ? 1 : 0)) : 0; } var i, k, today = new Date(), //获取当前日期 y = today.getFullYear(), //获取日期中的年份 m = today.getMonth(), //获取日期中的月份(需要注意的是:月份是从0开始计算,获取的值比正常月份的值少1) d = today.getDate(), //获取日期中的日(方便在建立日期表格时高亮显示当天) firstday = new Date(y, m, 1), //获取当月的第一天 dayOfWeek = firstday.getDay(), //判断第一天是星期几(返回[0-6]中的一个,0代表星期天,1代表星期一,以此类推) days_per_month = new Array(31, 28 + isLeap(y), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31), //创建月份数组 str_nums = Math.ceil((dayOfWeek + days_per_month[m]) / 7); //确定日期表格所需的行数 document.write("<table cellspacing='0'><tr><th>日</th><th>一</th><th>二</th><th>三</th><th>四</th><th>五</th><th>六</th></tr>"); //打印表格第一行(显示星期) for (i = 0; i < str_nums; i += 1) { //二维数组创建日期表格 document.write('<tr>'); for (k = 0; k < 7; k++) { var idx = 7 * i + k; //为每个表格创建索引,从0开始 var date = idx - dayOfWeek + 1; //将当月的1号与星期进行匹配 (date <= 0 || date > days_per_month[m]) ? date = ' ': date = idx - dayOfWeek + 1; //索引小于等于0或者大于月份最大值就用空表格代替 date == d ? document.write('<td class="today">' + date + '</td>') : document.write('<td>' + date + '</td>'); //高亮显示当天 } document.write('</tr>'); } document.write('</table>'); </script>
CSS 부분을 자유롭게 플레이해 보세요. 현재 시간은 2016년 5월 2일입니다. 렌더링은 다음과 같습니다.
이상 내용이 이 글의 전체 내용입니다. 자바스크립트 프로그래밍을 배우시는 모든 분들께 도움이 되었으면 좋겠습니다.