JS判断日期是否合法并计算是该年的第几天

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>

<body>
    年:<input type="text" id="yearInput">
    月:<input type="text" id="monthInput">
    日:<input type="text" id="dayInput">
    <button id="btn">判断</button>
    <input type="text" id="result" disabled="disabled">
</body>
<script>
    var yearInp = document.getElementById("yearInput");           //获取元素id
    var monthInp = document.getElementById("monthInput");
    var dayInp = document.getElementById("dayInput");
    var btn1 = document.getElementById("btn");
    var result = document.getElementById("result");

    btn1.onclick = function () {           //点击事件
        result.value = isDate(yearInp, monthInp, dayInp);
    }
    //定义判断年月日是否在1~9999之内合法的函数
    function isDate(year, month, day) { //传入参数为获取的元素id,获取文本框内容需要用.value属性
        var maxDay = 0;   //存储月份日期最大值,判断输入日期是否合法使用
        var sum = 0;    //存储求和,计算该年第几天
        if (year.value <= 9999 && year.value >= 1 && year.value % 1 == 0) {   //判断年份是否在1~9999之间,对1求余判断是整数
            if (month.value % 1 == 0 && month.value <= 12 && month.value >= 1) {     //判断输入的月份是否是在1~12的整数
                switch (month.value) {                 //switch选择相应的月份,给maxDay日期最大值赋值
                    case '1':
                    case '3':
                    case '5':      //字符串数字,文本输入框获取的是字符串类型
                    case '7':       //switch里的case匹配表达式是全等 “ === ”,数据和类型都相等才执行代码
                    case '8':
                    case '10':
                    case '12':
                        maxDay = 31;
                        break;
                    case '4':
                    case '6':
                    case '9':
                    case '11':
                        maxDay = 30;
                        break;
                    case '2':
                        maxDay = year.value % 4 == 0 && year.value % 100 != 0 || year.value % 400 == 0 ? 29 : 28; //三目运算符,判断是否是闰年二月
                        break;
                    default:
                        var error = new Error("出现了意料之外的情况");      //设置控制台报错提示
                        throw error;                                 //抛出控制台错误
                        break;
                }

                var February = year.value % 4 == 0 && year.value % 100 != 0 || year.value % 400 == 0 ? 29 : 28;   //闰年二月对应天数

                switch (month.value) {            //  年月日输入计算  (n = 前n-1月之和 + 当前月的几号)
                    //switch穿透应用,表达式与case匹配成功后没有break语句则会不匹配下一个case,直接执行下一个case里的代码
                    case '12': sum += 30;           //十一月的31天
                    case '11': sum += 31;           //十月的31天
                    case '10': sum += 30;           //九月的30天           
                    case '9': sum += 31;            //八月的31天
                    case '8': sum += 31;            //七月的31天
                    case '7': sum += 30;            //六月的30天
                    case '6': sum += 31;            //五月的31天
                    case '5': sum += 30;            //四月的30天
                    case '4': sum += 31;            //三月的31天
                    case '3': sum += February;      //二月的28/29天
                    case '2': sum += 31;            //1月的31天
                    case '1': sum += day.value * 1; break;    //当前月的天数   获取的为字符串类型,和数字乘法运算隐式转换数字类型
                    default:
                        var error = new Error("出现了意料之外的情况");
                        throw error;
                        break;
                }
                if (day.value >= 1 && day.value <= maxDay && day.value % 1 == 0) {    //判断输入的日期是合理
                    return year.value + "年的第" + sum + "天";    //返回输入求和值,当前年的第几天
                } else {
                    var error = new Error("请输入正确的日期");
                    throw error;
                }
            } else {
                var error = new Error("请输入1~12的月份");
                throw error;
            }
        } else {
            var error = new Error("请输入1000~9999的年份");     //设置控制台报错提示
            throw error;                                        //抛出控制台错误
        }
    }
</script>

</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值