百度前端Day25-27训练

题目:
使用上方的HTML结构(可以根据需要自行微调)为基础编写JavaScript代码
当变更任何一个select选择时,更新 result-wrapper 的内容
当所选时间早于现在时间时,文案为 现在距离 “所选时间” 已经过去 xxxx
当所选时间晚于现在时间时,文案为 现在距离 “所选时间” 还有 xxxx
注意当前时间经过所选时间时候的文案变化
注意选择不同月份的时候,日期的可选范围不一样,比如1月可以选31天,11月只有30天,注意闰年
同样,需要注意,通过优雅的函数封装,使得代码更加可读且可维护
心得收获:

  1. 学会多封装函数,提高代码复用率。
  2. new Date()中可以加年月日时分秒来直接新建一个指定的事件。
  3. section标签可以通过onchange事件来监听option的改变,也可以通过value来获得当时所展示的option中的value值
  4. 注意定时器的使用,再使用下一个定时器时,要关闭上一个定时器
  5. 简单的选择可以利用数组存储不同的值,然后通过不用的数组下标,来选择不同的值,列如星期的选择:
function week(i) {
            let week = ["日", "一", "二", "三", "四", "五", "六", ];
            return '星期' + week[i];
        }
  1. 计算毫秒和日时分的转换时,将日时分全部转换为毫秒有利于计算
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <select id="year-select">
    </select>

    <select id="month-select">
    </select>

    <select id="day-select">
    </select>

    <select id="hour-select">
    </select>

    <select id="minite-select">
    </select>

    <select id="second-select">
    </select>

    <p id="result-wrapper">现在距离 2001年1月1日星期X HH:MM:SS 还有 X 天 X 小时 X 分 X 秒</p>

    <script>
        //setInterval(allString, 1000)
        const year = document.getElementById('year-select');
        const month = document.getElementById('month-select');
        const date = document.getElementById('day-select');
        const hour = document.getElementById('hour-select');
        const minite = document.getElementById('minite-select');
        const second = document.getElementById('second-select');
        let sections = document.getElementsByTagName('select');
        let yearValue = 2000;
        let dateValue = 1;
        let hourValue = 0;
        let monthValue = 1;
        let minuteValue = 0;
        let secondValue = 0;
        let id=0;
        creatOptions();
        allString();
        //更改option时调整时间的显示

        for (let key in sections) {
            sections[key].onchange = function () {
                if (key === '0' || key === '1') {
                    yearValue = Number(document.getElementById('year-select').value);
                    monthValue = Number(document.getElementById('month-select').value);
                    changetime(yearValue, monthValue);
                    allString();


                } else {

                    dateValue = Number(document.getElementById('day-select').value);
                    hourValue = Number(document.getElementById('hour-select').value);
                    secondValue = Number(document.getElementById('second-select').value);
                    minuteValue = Number(document.getElementById('minite-select').value);
                    allString()

                }

            }
        }

        //生成option标签,且初始化数据
        function creatOptions() {
            repeatOption(year, 33, 2000);
            repeatOption(month, 12, 1);
            repeatOption(date, 31, 1);
            repeatOption(hour, 24, 0);
            repeatOption(minite, 60, 0);
            repeatOption(second, 60, 0);
        }
        //生成一个option标签
        function repeatOption(parent, n, i) {
            while (n > 0) {
                let opt = document.createElement('option');
                opt.value = i;
                opt.innerHTML = i;
                parent.appendChild(opt);
                i++
                n--;
            }

        }
        //根据年份更改天数
        function changetime(year, month) {
            let day = 0;
            if (month == 2) {
                // 闰年
                if ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0) {
                    day = 29;
                }
                //平年
                else {
                    day = 28;
                }
            } else if (month == 4 || month == 6 || month == 9 || month == 4) {
                day = 30;
            } else {
                day = 31;
            }
            //删去原有子节点
            date.innerHTML = " ";
            repeatOption(date, day, 1);
            //更换月份之后更改日的值

        }


        //显示总的字符串在屏幕上

        function allString() {
            clearInterval(id);//关闭上一个定时器
            const p = document.getElementById('result-wrapper');
            let dateSet = new Date(yearValue, monthValue - 1, dateValue, hourValue, minuteValue, secondValue);
           id = setInterval(function () {
                let dataNow = new Date();
                let timesSet = dateSet.getTime();
                let timesNow = dataNow.getTime();
                let differ = timesSet - timesNow;
                const setTimeStr = setTimeString(dateSet);
                const xTime = xTimeString(differ);
                if (differ > 0) {
                    p.innerHTML = '现在距离' + setTimeStr + '还有' + xTime
                } else {
                    p.innerHTML = '现在距离' + setTimeStr + '已经过去' + xTime
                }
            }, 1000)

        }
        //将两个日期之间的差值转换为X 天 X 小时 X 分 X 秒的函数
        function xTimeString(differ) {
            if (differ < 0) {
                differ = -differ;
            }
            let minutes = 1000 * 60;
            let hours = minutes * 60;
            let days = hours * 24;
            let showDays = Math.floor(differ / days);
            let extDays = differ % days;

            if (extDays !== 0) {
                var showHours = Math.floor(extDays / hours);
                if (extDays % hours !== 0) {
                    var showMinutes = Math.floor((extDays % hours) / minutes);
                }
                if ((extDays % hours) % minutes !== 0) {
                    var showSeconds = Math.floor(((extDays % hours) % minutes) / 1000)
                }
            }
            let result = showDays + '天' + showHours + '小时' + showMinutes + '分' + showSeconds + '秒'
            return result
        }


        //将设置时间显示成 2001年1月1日星期X HH:MM:SS格式的函数
        function setTimeString(date) {
            let dateStr = dateString(date);
            let weekday = week(date.getDay());
            let timeStr = timeString(date);
            let result = dateStr + weekday + timeStr;
            return result

        }

        function week(i) {
            let week = ["日", "一", "二", "三", "四", "五", "六", ];
            return '星期' + week[i];
        }

        function timeString(date) {
            let res1 = date.toTimeString();
            let res2 = res1.split(' ');
            let res3 = res2[0].split(':');
            res3[0] = zore(res3[0]);
            return res2[0];

        }

        function dateString(date) {
            let res1 = date.toLocaleDateString();
            let res2 = res1.split('/');
            res2[1] = zore(res2[1]);
            res2[2] = zore(res2[2]);
            let result = res2[0] + '年' + res2[1] + '月' + res2[2] + '日';

            return result;

        }

        function zore(str) {
            if (str.length < 2) {
                str = '0' + str;
            }
            return str;
        }
    </script>
</body>

</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值