【实践】js实现windows系统日历

摘要:
想法:1.定义每个月的天数。2.获取当前系统日期的初始化数据。3.输出日历。2.1.首先将星期几作为当月的第一天。(这对于日历布局非常重要!)2.2.获取当前月份的天数2.3.获取当前月的周数2.4.获取显示的当前年份和月份˂!

思路:
1、定义好每一个月份的日期天数

2、获取当前的系统日期初始化数据

3、输出日历
    2.1、先获取当前月的第一天是星期几(这一点与日历的排版至关重要!)
    2.2、获取当前月的天数
    2.3、获取当前月有多少个星期(即要输出多少行 行数这里我会预留多一行)
    2.4、获取当前年份和月份 用作显示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>js 日历</title>
    <style type="text/css">
     *{
         border: 0;
         padding: 0;
         margin: 0;
         font-family: "微软雅黑";
     }
     a{
         text-decoration: none;
         color: #000;
     }
     li{
         list-style-type: none;
     }
     .calendar_wrap{
         width: 350px;
         margin: 0 auto;
         padding: 0;
         border: 1px solid #000;
     }
     .calendar_list{
         width: 100%;
         margin-top: 10px;
     }
     .calendar_list tr{
         width: 100%;
     }
     .calendar_list tr td{
         text-align: center;
         height: 45px;

     }
     .control_bar{
         word-spacing: -6px;
     }
     .control_bar span,.control_bar b{
         display: inline-block;
         text-align: center;
         word-spacing: 0px;
     }
     .left-bt,.right-bt{
         width: 50px;
     }
     #reduce_bt,#add_bt{
         width: 50%;
         height: 25px;
         border-radius: 50%;
     }
     #reduce_bt:focus{
         outline: none;
     }
     #add_bt:focus{
         outline: none;
     }
     #current_date{
         width: 250px;
     }
     #resetBt{
         display: block;
         text-align: center;
         color: #fff;
         cursor: pointer;
         width: 120px;
         line-height: 40px;
         background-color: #FF7F27;
         margin: 0 auto;
     }
     #date_list tr td:hover{
         background-color: #ccc;
         cursor: default;
     }
    </style>
</head>
<body>
    <div class="calendar_wrap">
    <div class="control_bar">
      <span class="left-bt"><input type="button" id="reduce_bt" value="<"></span>
      <b id="current_date">2017-02</b>
      <span class="right-bt"><input type="button" id="add_bt" value=">"></span>
    </div>
    <table class="calendar_list" cellspacing="0">
      <thead>
         <tr>
           <td></td>
           <td></td>
           <td></td>
           <td></td>
           <td></td>
           <td></td>
           <td></td>
         </tr> 
      </thead>
      <tbody id="date_list"></tbody>   
    </table>
   </div>
   <span id="resetBt">回到现在日期</span>
   <script type="text/javascript">
     var dateScreen = document.getElementById('current_date');//获取显示当前年份月份的div
     var reduceBt = document.getElementById('reduce_bt');//获取减少月份的按钮
     var addBt = document.getElementById('add_bt');//获取增加月份的按钮
     var dateList = document.getElementById('date_list');//获取显示所有日期部分
     var resetBt = document.getElementById('resetBt');//获取重设按钮
     //定义好每月的日期总数 总数按js 获取月份数值的下标方式储存
     var overall_date = [31,28,31,30,31,30,31,31,30,31,30,31];
     var add_date = 1;//定义添加日期数的初始化
     

     //初始化日历
     //获取现在的日期
     var now_date = new Date();
     var nowFullYear = now_date.getFullYear();
     var nowMonth = now_date.getMonth();
     //执行日历输出函数
     printCalendar();
     //-----------------------------------
     
     
     

     //月份减少按钮点击事件
     reduceBt.onclick = function(){
         nowMonth = nowMonth - 1;
         if (nowMonth == -1) {
             nowFullYear = nowFullYear - 1;
             nowMonth = 11;
         }
        clearRows();
         printCalendar();
     }
     

     //增加月份按钮点击事件
     addBt.onclick = function(){
         nowMonth+= 1;
         if (nowMonth == 12) {
             nowFullYear+= 1;
             nowMonth = 0;
         } 
         clearRows();
        printCalendar();
     }


     //重设按钮点击事件
     resetBt.onclick = function(){
         var resetDate = new Date();
         nowFullYear = resetDate.getFullYear();
         nowMonth = resetDate.getMonth();
         clearRows();
         printCalendar();
     }




     function printCalendar(){
         var printDate = new cur_date(nowFullYear,nowMonth);//实例cur_date方法
         var printFirstDay = printDate.firstDay;//获取要输出月份第一天的星期
         var printTotalDate = printDate.totalDate;//获取输出日期的总数
         var printMonth = printDate.cur_month;//获取输出的月份
         (printMonth >= 9)?(printMonth = (printMonth + 1)):(printMonth = ("0" + (printMonth + 1)));
         //调整月份的显示格式
         var printYear = printDate.cur_year;//获取输出的年份
        var totalRows = Math.ceil((printTotalDate + (printFirstDay - 1)) / 7) + 1;
        //获取行数
        //利用天数除以7天获得行数并将它向上去整 但是上限是5
        //而考虑到某些月会有6行所以在总行数里面加1 以防万一

        //开始输出
        //首先显示出年和月
        dateScreen.innerText = printYear + "-" + printMonth;

        
        
            //开始输出日期
            for (var i = 0; i < totalRows; i++) {
               dateList.insertRow(i);
             for (var j = 0; j < 7; j++) {
                 //当天数总量大于额定总量时先终止内部循环
                if (add_date > printTotalDate) {
                    break;
                }

                dateList.rows[i].insertCell(j);

                //改变周日和周六的文字颜色
                if (j == 0) {
                    dateList.rows[i].cells[j].style.color = "red";
                    dateList.rows[i].cells[j].style.fontWeight = "bold";
                }else if(j == 6){
                    dateList.rows[i].cells[j].style.color = "green";
                    dateList.rows[i].cells[j].style.fontWeight = "bold";
                }

                
                if (i == 0 && j >= printFirstDay) {
                    //当此时是第一行时而且单元格下标大于等于当前月第一天的星期就开始为单元格填入文本
                    dateList.rows[i].cells[j].innerText = add_date;
                    add_date++;
                }else if(i > 0){
                    //第一行以后的单元格就按循环添加即可
                    dateList.rows[i].cells[j].innerText = add_date;
                    add_date++;
                }
                
                
                

             }
                 
           }
        
        
        add_date = 1;//输出完把日期总数重新赋值为1
     }


     //获取当前年、月、第一天是星期几、日期总数
     function cur_date(curYear,curMonth){
         this.cur_firstDate = new Date(curYear,curMonth,1);//获取现在日期的第一天
         this.cur_year = curYear;//获取当前的年
         this.cur_month = curMonth;//获取当前的月
         this.totalDate = is_leapYear(curYear,curMonth);//获取总天数
         this.firstDay = this.cur_firstDate.getDay()//获取每个月的第一天是星期几
     }
     
     //判断今年是否为闰年
     function is_leapYear(target_year,target_month){
         if ((target_month == 1) && (target_year % 4 == 0) && ((target_year % 100 != 0) || (target_year % 400 != 0))) {
                   //当前月是2月且当前年是闰年
                   return 29;
         }else{
             //其他月按正常日期总数输出
             return overall_date[target_month];
         }
     }

     function clearRows(){
         var rowsNum = dateList.rows.length;
        while(rowsNum > 0){
            dateList.deleteRow(rowsNum - 1);
            rowsNum--;
        }
     }

   </script>
</body>
</html>

免责声明:文章转载自《【实践】js实现windows系统日历》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇EntityFramework Core 学习系列(一)Creating Model电子签名实现的思路、困难及解决方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容

分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容 在写JS的过程中,为了调试我们常常会 写很多 console.log、console.info、console.group、console.warn、console.error代码来查看JS 的运行情况,但发布时又因为IE不支持console,又要去掉这些代码,一不小心就会出错 问题...

浏览器F12调试器定位系统前后端bug

做测试的小伙伴可能用过httpwatch,firebug,fiddler,charles等抓包(数据包)工具,但实际上除了这些还有一个简单实用并的抓包工具,那就是浏览器的F12调试器。 httpwatch,firebug都是浏览器的插件,需要额外下载,fiddler,charles也需要额外下载安装包另行安装,但是浏览器F12调试器却是所有浏览器内...

[转载]date命令时间转换

Linux时间戳和标准时间的互转 在LINUX系统中,有许多场合都使用时间戳的方式表示时间,即从1970年1月1日起至当前的天数或秒数。如/etc/shadow里的密码更改日期和失效日期,还有代理服务器的访问日志对访问时间的记录等等。 下面介绍几种时间戳格式和标准时间格式转换的方法:1、分别以标准格式和时间戳来显示当前时间[root@365linux ~]...

JS----对象的合并与克隆与数组的深浅克隆

在js中,数组和对象的复制如果使用=号来进行复制,那只是浅拷贝。如下图演示: 如上,arr的修改,会影响arr2的值,这显然在绝大多数情况下,并不是我们所需要的结果。因此,数组以及对象的深拷贝就是javascript的一个基本功了。 对象: 一. 合并与克隆的差别 1. 克隆是特殊的合并(以空对象作为目标对象,非空对象作为源对象进行合并),克隆要求目标...

IE浏览器没有加载CSS或js文件的秘密及解决办法

其实是两处资料拼成这一篇博文的,因为在开发过程中遇到,有的文章只是说明原因,而没有给出解决方案,所以再次给出解释和解决方法,以供参考,如果有好的解决方法,也请分享下! --------------------------------------------------------------写在前面的话 [IE浏览器没有加载CSS或js文件的秘密] 如果有...

Js计算时间差

var runTime = (t1.getTime() - t2.getTime())/1000; var year = Math.floor(runTime / 86400 / 365);...