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 相关文章推荐
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
Apr 01 Javascript
用jquery存取照片的具体实现方法
Jun 30 Javascript
DIV始终居中的js代码
Feb 17 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
May 03 Javascript
jQuery实现表单提交时判断的方法
Dec 13 Javascript
JavaScript实现级联菜单的方法
Jun 29 Javascript
在Node.js应用中读写Redis数据库的简单方法
Jun 30 Javascript
探讨JavaScript标签位置的存放与功能有无关系
Jan 15 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
Nov 07 Javascript
微信小程序之小豆瓣图书实例
Nov 30 Javascript
详解.vue文件中监听input输入事件(oninput)
Sep 19 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
Dec 25 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
简单的JS多重继承示例
2008/03/13 Javascript
javascript parseInt 大改造
2009/09/27 Javascript
jquery $(document).ready() 与window.onload的区别
2009/12/28 Javascript
在Windows上安装Node.js模块的方法
2011/09/25 Javascript
jquery中ajax学习笔记一
2011/10/16 Javascript
ScrollDown的基本操作示例
2013/06/09 Javascript
JQuery中使用Ajax赋值给全局变量异常的解决方法
2014/01/10 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
基于Jquery制作图片文字排版预览效果附源码下载
2015/11/18 Javascript
JQuery实现简单的图片滑动切换特效
2015/11/22 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
基于touch.js手势库+zepto.js插件开发图片查看器(滑动、缩放、双击缩放)
2016/11/17 Javascript
浅谈Nodejs中的作用域问题
2016/12/26 NodeJs
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
node实现基于token的身份验证
2018/04/09 Javascript
ionic使用angularjs表单验证(模板验证)
2018/12/12 Javascript
vue实现element表格里表头信息提示功能(推荐)
2019/11/20 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
2020/10/27 Javascript
[03:39]DOTA2英雄梦之声_第05期_幽鬼
2014/06/23 DOTA
Python引用(import)文件夹下的py文件的方法
2014/08/26 Python
python检测某个变量是否有定义的方法
2015/05/20 Python
Python编程求质数实例代码
2018/01/31 Python
分析Python读取文件时的路径问题
2018/02/11 Python
Python变量赋值的秘密分享
2018/04/03 Python
python实现局域网内实时通信代码
2019/12/22 Python
PyTorch 对应点相乘、矩阵相乘实例
2019/12/27 Python
Python sys模块常用方法解析
2020/02/20 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
Python 生成短8位唯一id实战教程
2021/01/13 Python
合伙经营协议书范本
2014/04/18 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
2014年行政执法工作总结
2014/12/11 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
详解Java分布式事务的 6 种解决方案
2021/06/26 Java/Android
Java 实现限流器处理Rest接口请求详解流程
2021/11/02 Java/Android