08js-函数时间差

css:

<body>
<select id="year-select" οnchange="timeChange()"></select>
<select id="month-select" οnchange="timeChange()"></select>
<select id="day-select" οnchange="timeChange()"></select>
<select id="hour-select" οnchange="timeChange()"></select>
<select id="minite-select" οnchange="timeChange()"></select>
<select id="second-select" οnchange="timeChange()"></select>
<p id="result-wrapper">现在距离 2001年1月1日星期X HH:MM:SS 还有 X 天 X 小时 X 分 X 秒</p>
</body>
  • 当变更任何一个select选择时,更新 result-wrapper 的内容
  • 当所选时间早于现在时间时,文案为 现在距离 "所选时间" 已经过去 xxxx
  • 当所选时间晚于现在时间时,文案为 现在距离 "所选时间" 还有 xxxx
  • 注意当前时间经过所选时间时候的文案变化
  • 注意选择不同月份的时候,日期的可选范围不一样,比如1月可以选31天,11月只有30天,注意闰年
  • 同样,需要注意,通过优雅的函数封装,使得代码更加可读且可维护

思路:在原生js中,用select选择的onchange函数实现,我的理解是onchange就是刷新函数,当我选择不同的年份,月份时候,我要在刷新函数里面去获得被选择的值。这里给每个select都绑定该函数。

<select id="select" οnchange="timechange()">

年份,月份,这些是提前生成好的固定的数。年份我可以自选,月份只有1-12月。主要难点在天数,让它根据年和月份来变换。

首先获取到选择框元素:

var year=document.getElementById('year-select');
var month=document.getElementById('month-select');
var day=document.getElementById('day-select');
var hour=document.getElementById('hour-select');
var minite=document.getElementById('minite-select');
var second=document.getElementById('second-select');

生成年份和月份的函数(这里主要学到了怎么select动态生成options并给它赋值):

function createYearOp() {
    var date = new Date();
    for(var i=2000;i<date.getFullYear()+1;i++){
        var opt=document.createElement('option');
        opt.value=i;
        opt.innerText=i;
        year.appendChild(opt);
    }
}
createYearOp();
function createMonthOp() {
    for(var i=1;i<13;i++){
        var opt=document.createElement('option');
        opt.value=i;
        opt.innerText=i;
        month.appendChild(opt);
    }
}
createMonthOp();

生成天数的函数(有传参,配合后面判断闰年的函数):

function createDayOp(days) {
    for(var i=1;i<days;i++){
        var opt=document.createElement('option');
        opt.value=i;
        opt.innerText=i;
        day.appendChild(opt);
    }

}
createDayOp(32);//这里默认它生成一个月31天

生成时、分、秒的函数:

function createHms(hms) {
    for(var i=0;i<60;i++){
        if(i<10){//使时间格式化00:00:00
            i="0"+i;
        }
        var opt=document.createElement('option');
        opt.value=i;
        opt.innerText=i;
        hms.appendChild(opt);
    }

}
createHms(hour);
createHms(minite);
createHms(second);

此时生成了默认的时间(但互相之间没有建立联系),所以为了建立联系,取得此时我选择的各个时间值,封装成函数(这里主要学到了怎么取得select被选择的当前值,用obj.options[obj.selectedIndex]):

function select(obj) {//返回当前被选择的对象
    var Index=obj.selectedIndex;
    var Value=obj.options[Index].value;
    return Value;
}

主要函数onchange建立年月日之间的联系(还有比较函数也在里面,因为要实时刷新):
function timeChange() {
    var date = new Date();
      y=select(year);
      m=select(month);
      d=select(day);
      h=select(hour);
      w=getWeekday(date.getDay());
      t=select(minite);
      s=select(second);
      if(m==1||m==3||m==5||m==7||m==8||m==10||m==12){//这里就是建立月份与天数的关系
        createDayOp(32);
    }else if(m==2){//如果月份为2的话
        if((y%4==0)&&(y%100!=0)){//先判断年份是否为闰年
            createDayOp(30);
        }else {createDayOp(29);}
    }else {
        createDayOp(31);
    }
    show(y,m,d,w,h,t,s);//与当前时间比较函数
}
function getWeekday(w){//星期比较特殊,转换为中文
    var weekday=new Array(7);
    weekday[0]="星期日";
    weekday[1]="星期一";
    weekday[2]="星期二";
    weekday[3]="星期三";
    weekday[4]="星期四";
    weekday[5]="星期五";
    weekday[6]="星期六";
    return weekday[w];
}

被封装的比较函数:

function show(y,m,d,w,h,t,s){
    var date = new Date();//得到当前时间
    var date1=new Date(y+"/"+m+"/"+d+"  "+h+":"+t+":"+s);//将字符串转换为时间
    var second=date1.getTime()-date.getTime();//得到两个时间的相差毫秒数
    if(second<0) {
        second = -second;
        var time1=transfer(second);//将毫秒数转换成几天几时几秒
        document.getElementById('result-wrapper').innerHTML = "现在距离" + y + "年 " + m + "月" + d + "日 " + w + "  " + h + ":" + t + ":" + s + "已经过去了" + time1;
    }else {
       var time2=transfer(second);
        document.getElementById('result-wrapper').innerHTML = "现在距离" + y + "年 " + m + "月" + d + "日 " + w + "  " + h + ":" + t + ":" + s + "还有" +time2;

    }
}

毫秒数转换成几天几时几秒的函数:

function transfer(second) {
    var days = Math.floor(second / (24 * 3600 * 1000));
    var leave1 = second % (24 * 3600 * 1000)    //计算天数后剩余的毫秒数
    var hours = Math.floor(leave1 / (3600 * 1000))
    //计算相差分钟数
    var leave2 = leave1 % (3600 * 1000)        //计算小时数后剩余的毫秒数
    var minutes = Math.floor(leave2 / (60 * 1000))
    //计算相差秒数
    var leave3 = leave2 % (60 * 1000)      //计算分钟数后剩余的毫秒数
    var seconds = Math.round(leave3 / 1000)
    var time=days + "天 " + hours + "小时 " + minutes + " 分钟" + seconds + " 秒";
    return time;
}

今天碰到的问题:

1.思路问题:刚开始以为在各自的创造年,月,日的函数中先取得先前的值就行,忽略了两个问题,函数里的参数传不出来,而且无法更新所选取的值,后面在网上搜到了onchange函数,可以在点击选择框之后更新。由此我将取值还有一些动态的改变都放在该函数。

2.新知识的记录:

     关于select:

        2.1 select动态生成options:

             var sel=document.getElementById('select');

             var opt=document.createElement('option');

             opt.value=XX;

             opt.innerText=XX;

             sel.appendchild(opt);

        2.2 select的onchange函数可以是刷新函数

              <select id="select" οnchange="timechange()">

        2.3如何取得被选中的select的选项的值:

               var Index=obj.selectedIndex;

               var Value=obj.options[Index].value;

   关于时间:

        2.1闰年就是被4整除但不被100整除的年份

        2.2格式化时间:

                  if(i<10){

                         i="0"+i;}

         2.3如何将字符串转换为时间:

                 var date1=new Date(y+"/"+m+"/"+d+" "+h+":"+t+":"+s);

         2.4计算两个时间相差的毫秒数并转换为天,时,分,秒:

                    var date3=date1.getTime()-date2.getTime();

                     var days=Math.round(date3/24*3600*1000);//天

                      var leave1=date3%24*3600*1000;

                       var hours=leave1/3600*1000;//小时

                       var leave2=leave1%3600*1000;

                        var minutes=leave2/60*1000;//分钟

                        var leave3=leave2%60*1000;

                        var second=leave3/1000;//秒

                      

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值