Javascript:简易天数计算器

效果图:
这里写图片描述

功能:
1. 支持选择日期;
2. 自动计算闰年;
3. 支持使用当前日期。

代码:
(1)html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>简易天数计算器</title>
    <script type="text/javascript" src="js/dayCounter.js"></script>

</head>
<body onload="initView(['year', 'month', 'day']); initView(['year2', 'month2', 'day2'])">

<form>
    开始日期
    <select id="year" onchange="update(1)">
    </select><select id="month" onchange="update(1)">
    </select><select id="day">
    </select><input type="checkbox" id="startCb" onclick="useTodayAsStart()">使用当前日期

    <br/>
    结束日期
    <select id="year2" onchange="update(2)">
    </select><select id="month2" onchange="update(2)">
    </select><select id="day2">
    </select><input type="checkbox" id="endCb" onclick="useTodayAsEnd()">使用当前日期

    <br/>
    <br/>
</form>

<button onclick="calDays('dayCountText')">计算天数</button>

<p id="dayCountText" style="margin-left: 10px;"></p>

<script type="text/javascript">
    /**
     * 根据年和月更新日列表.
     * @param flag 1-开始日期 2-结束日期
     */
    function update(flag) {
        if (flag == 1) {
            updateDaySelect(['year', 'month', 'day']);
        } else {
            updateDaySelect(['year2', 'month2', 'day2']);
        }
    }

    //计算天数
    function calDays(id) {
        var s = getDateStr(['year', 'month', 'day']);
        var e = getDateStr(['year2', 'month2', 'day2']);
        document.getElementById(id).innerHTML = calDayCount(s, e);
    }

    //使用当前日期作为开始日期
    function useTodayAsStart() {
        var checked = document.getElementById('startCb').checked;
        useToday(1, checked);
    }

    //使用当前日期作为结束日期
    function useTodayAsEnd() {
        var checked = document.getElementById('endCb').checked;
        useToday(2, checked);
    }

    /**
     * 使用当前日期。
     * @param flag 1-开始日期 2-结束日期
     * @param checked true-使用当前时期 false-取消使用当前日期
     */
    function useToday(flag, checked) {
        var elements;
        if (flag == 1) {
            elements = getElements(['year', 'month', 'day']);
        } else {
            elements = getElements(['year2', 'month2', 'day2']);
        }

        if (checked) {
            //使用当前日期
            var ymd = getTodayYMD();

            var a;
            //设置年
            var yEle = elements[0];
            for (a = 0; a < yEle.options.length; a++) {
                if (yEle.options[a].value == ymd[0]) {
                    yEle.options[a].selected = "selected";
                    break;
                }
            }

            //设置月
            var mEle = elements[1];
            for (a = 0; a < mEle.options.length; a++) {
                if (mEle.options[a].value == ymd[1] + 1) {
                    mEle.options[a].selected = "selected";
                    break;
                }
            }

            //根据年和月更新日列表
            update(flag);
            //设置日
            var dEle = elements[2];
            for (a = 0; a < dEle.options.length; a++) {
                if (dEle.options[a].value == ymd[2]) {
                    dEle.options[a].selected = "selected";
                    break;
                }
            }
        }

        for (var i = 0; i < elements.length; i++) {
            elements[i].disabled = checked ? "disabled" : undefined;
        }
    }
</script>

</body>
</html>

(2)外部js文件:

/**
 * dayCounter.
 * Created by Jack on 16-11-29.
 */

/**
 * 通过元素的id获取Element.
 * @param arr id数组.
 */
function getElements(arr) {
    var elements = [];
    for (var i = 0; i < arr.length; i++) {
        elements.push(document.getElementById(arr[i]));
    }
    return elements;
}

//初始化年月日
function initView(arr) {
    var elements = getElements(arr);
    //年
    for (var i = 2048; i >= 1949; i--) {
        var option = document.createElement("option");
        option.setAttribute("value", "" + i);
        option.appendChild(document.createTextNode("" + i));

        //默认选中2016年
        if (i == 2016) {
            option.setAttribute("selected", "selected")
        }
        elements[0].appendChild(option);
    }

    //月
    for (var a = 1; a <= 12; a++) {
        var optionM = document.createElement("option");
        optionM.setAttribute("value", "" + a);
        optionM.appendChild(document.createTextNode((a < 10 ? "0" : "") + a));
        elements[1].appendChild(optionM);
    }

    //日
    initDay(elements[2], 31, 1);
}

function initDay(day, dayCount, selectedValue) {
    for (var i = 1; i <= dayCount; i++) {
        var optionD = document.createElement("option");
        optionD.setAttribute("value", "" + i);
        if (i == selectedValue) {
            optionD.setAttribute("selected", "selected");
        }

        optionD.appendChild(document.createTextNode((i < 10 ? "0" : "") + i));
        day.appendChild(optionD);
    }
}

//当年和月发生变化时,更新日
function updateDaySelect(arr) {
    var elements = getElements(arr);
    //选中年
    var y = elements[0].options[elements[0].selectedIndex].value;
    //选中月
    var m = elements[1].options[elements[1].selectedIndex].value;

    if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) {
        setupDay(elements[2], 31);
    } else if (m == 4 || m == 6 || m == 9 || m == 11) {
        setupDay(elements[2], 30);
    } else {
        //判断是否为闰年
        if ((y % 4 == 0 && y % 100 != 0 ) || y % 400 == 0) {
            setupDay(elements[2], 29);
        } else {
            setupDay(elements[2], 28);
        }
    }
}

//更新 日 select元素
function setupDay(day, dayCount) {
    //判断是否需要刷新
    if (day.options.length == dayCount) {
        //无需刷新
        return;
    }

    //原来选中的 日
    var oldValue = day.options[day.selectedIndex].value;
    if (oldValue > dayCount) {
        oldValue = dayCount;
    }

    //首先移除所有子元素
    for (var i = day.childNodes.length - 1; i >= 0; i--) {
        day.removeChild(day.childNodes.item(i))
    }

    //添加元素
    initDay(day, dayCount, oldValue);
}

function getSelectedText(ele) {
    return ele.options[ele.selectedIndex].text;
}

function getDateStr(arr) {
    var elements = getElements(arr);
    return getSelectedText(elements[0]) + "/" + getSelectedText(elements[1]) + "/" + getSelectedText(elements[2]);
}

/**
 * 计算天数,日期格式为 2016/08/09
 * @param startDay 开始日期
 * @param endDay 结束日期
 */
function calDayCount(startDay, endDay) {
    var s = new Date(startDay + " 00:00:00").getTime();
    var e = new Date(endDay + " 00:00:00").getTime();
    return (e - s) / 86400000;
}

function getTodayYMD() {
    var date = new Date();
    return [date.getFullYear(), date.getMonth(), date.getDate()];
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值