JavaScript实现简易的天数计算器实例【附demo源码下载】


Posted in Javascript onJanuary 18, 2017

本文实例讲述了JavaScript实现简易的天数计算器。分享给大家供大家参考,具体如下:

运行效果图如下:

JavaScript实现简易的天数计算器实例【附demo源码下载】

功能:

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

代码:

(1)html文件:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>简易天数计算器</title>
  <script type="text/javascript" src="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));
    //默认选中2017年
    if (i == 2017) {
      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()];
}

完整demo实例代码点击此处本站下载

PS:这里再为大家推荐几款比较实用的天数计算在线工具供大家使用:

在线日期/天数计算器:
http://tools.3water.com/jisuanqi/date_jisuanqi

在线日期计算器/相差天数计算器:
http://tools.3water.com/jisuanqi/datecalc

在线日期天数差计算器:
http://tools.3water.com/jisuanqi/onlinedatejsq

在线天数计算器:
http://tools.3water.com/jisuanqi/datejsq

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
心扬JS分页函数代码
Sep 10 Javascript
javascript使用isNaN()函数判断变量是否为数字
Sep 21 Javascript
jQuery的animate函数实现图文切换动画效果
May 03 Javascript
jQuery事件绑定用法详解
Sep 08 Javascript
JavaScript基于自定义函数判断变量类型的实现方法
Nov 23 Javascript
原生js实现查询天气小应用
Dec 09 Javascript
ajax实现动态下拉框示例
Jan 10 Javascript
Bootstrap框架安装使用详解
Jan 21 Javascript
vue.js父组件使用外部对象的方法示例
Apr 25 Javascript
详解通过JSON数据使用VUE.JS
May 26 Javascript
vue v-model动态生成详解
Jun 30 Javascript
vue resource发送请求的几种方式
Sep 30 Javascript
原生Javascript插件开发实践
Jan 18 #Javascript
js实现炫酷的左右轮播图
Jan 18 #Javascript
jQuery实现别踩白块儿网页版小游戏
Jan 18 #Javascript
工厂模式在JS中的实践
Jan 18 #Javascript
基于jQuery制作小图标上下滑动特效
Jan 18 #Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
Jan 18 #Javascript
动态加载css方法实现和深入解析
Jan 18 #Javascript
You might like
php调整gif动画图片尺寸示例代码分享
2013/12/05 PHP
php学习笔记之基础知识
2014/11/08 PHP
php arsort 数组降序排序详细介绍
2016/11/17 PHP
php PDO异常处理详解
2016/11/20 PHP
php使用crypt()函数进行加密
2017/06/08 PHP
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
jQuery animate和CSS3相结合实现缓动追逐效果附源码下载
2016/04/18 Javascript
JS 数字转换为大写金额的简单实例
2016/08/04 Javascript
前端面试知识点锦集(JavaScript篇)
2016/12/28 Javascript
Angular2 PrimeNG分页模块学习
2017/01/14 Javascript
利用js判断手机是否安装某个app的多种方案
2017/02/13 Javascript
jQuery实现 上升、下降、删除、添加一行代码
2017/03/06 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
Vue2 使用 Echarts 创建图表实例代码
2017/05/18 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
2017/09/28 Javascript
详解vue.js之props传递参数
2017/12/12 Javascript
axios拦截设置和错误处理方法
2018/03/05 Javascript
js中的 || 与 &amp;&amp; 运算符详解
2018/05/24 Javascript
利用jqgrid实现上移下移单元格功能
2018/11/07 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
vue 使用class创建和清除水印的示例代码
2020/12/25 Vue.js
使用Python发送各种形式的邮件的方法汇总
2015/11/09 Python
python中Matplotlib实现绘制3D图的示例代码
2017/09/04 Python
Python实现登陆文件验证方法
2018/10/06 Python
python 判断参数为Nonetype类型或空的实例
2018/10/30 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
pyspark给dataframe增加新的一列的实现示例
2020/04/24 Python
python中pyplot基础图标函数整理
2020/11/10 Python
CSS3条纹背景制作的实战攻略
2016/05/31 HTML / CSS
苹果中国官方网站:Apple中国
2016/07/22 全球购物
越南综合购物网站:Lazada越南
2019/06/10 全球购物
天网面试题
2013/04/07 面试题
主持人婚宴答谢词
2014/01/28 职场文书
五好关工委申报材料
2014/05/31 职场文书
工作计划范文之财务管理
2019/08/09 职场文书
SpringBoot生成License的实现示例
2021/06/16 Java/Android