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直接编辑当前cookie的脚本
Sep 14 Javascript
jquery 打开窗口返回值实现代码
Mar 04 Javascript
JS获取各种浏览器窗口大小的方法
Jan 14 Javascript
Javascript递归打印Document层次关系实例分析
May 15 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
May 25 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
Sep 05 Javascript
jQuery动画效果相关方法实例分析
Dec 31 Javascript
JS中script标签defer和async属性的区别详解
Aug 12 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
Sep 20 Javascript
微信小程序获取手机号授权用户登录功能
Nov 09 Javascript
ES6 系列之 WeakMap的使用示例
Aug 06 Javascript
解决VUEX的mapState/...mapState等取值问题
Jul 24 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生成网页快照 不用COM不用扩展.
2010/02/11 PHP
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
2011/07/31 Javascript
JavaScript判断浏览器类型的方法
2015/02/10 Javascript
js实现宇宙星空背景效果的方法
2015/03/03 Javascript
全面了解JavaScirpt 的垃圾(garbage collection)回收机制
2016/07/11 Javascript
微信小程序模板之分页滑动栏
2017/02/10 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
详解webpack之scss和postcss-loader的配置
2018/01/09 Javascript
Vue render深入开发讲解
2018/04/13 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
利用Dectorator分模块存储Vuex状态的实现
2019/02/05 Javascript
[01:49]一目了然!DOTA2DotA快捷操作对比第二弹
2014/05/16 DOTA
python实现k均值算法示例(k均值聚类算法)
2014/03/16 Python
Python的Flask框架中web表单的教程
2015/04/20 Python
深度定制Python的Flask框架开发环境的一些技巧总结
2016/07/12 Python
Python中模块string.py详解
2017/03/12 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
2018/06/25 Python
对python自动生成接口测试的示例讲解
2018/11/30 Python
Python opencv实现人眼/人脸识别以及实时打码处理
2019/04/29 Python
Pandas —— resample()重采样和asfreq()频度转换方式
2020/02/26 Python
Python greenlet和gevent使用代码示例解析
2020/04/01 Python
Python应用自动化部署工具Fabric原理及使用解析
2020/11/30 Python
详解HTML5表单新增属性
2016/12/21 HTML / CSS
Html5跳转到APP指定页面的实现
2020/01/14 HTML / CSS
香港草莓网土耳其网站:Strawberrynet TR
2017/03/02 全球购物
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
2013/06/16 面试题
大专自我鉴定范文
2013/10/23 职场文书
法学个人求职信范文
2014/01/27 职场文书
劲霸男装广告词
2014/03/21 职场文书
党员创先争优承诺书
2014/03/26 职场文书
护理学院专科毕业生求职信
2014/06/28 职场文书
网上祭英烈活动总结
2015/02/04 职场文书
2015年重阳节慰问信
2015/03/23 职场文书
JavaScript获取URL参数的方法分享
2022/04/07 Javascript