Javascript实现简易天数计算器


Posted in Javascript onMay 18, 2020

本文实例为大家分享了Javascript实现简易天数计算器的具体代码,供大家参考,具体内容如下

效果图:

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()];
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery对象和DOM对象的相互转化实现代码
Mar 02 Javascript
一个简单的js动画效果代码
Jul 20 Javascript
关于jQuery UI 使用心得及技巧
Oct 10 Javascript
JQuery实现表格中相同单元格合并示例代码
Jun 26 Javascript
jQuery源码分析之Callbacks详解
Mar 13 Javascript
jquery实现表格隔行换色效果
Nov 19 Javascript
Ionic2调用本地SQlite实例
Apr 22 Javascript
利用Angular2 + Ionic3开发IOS应用实例教程
Jan 15 Javascript
.vue文件 加scoped 样式不起作用的解决方法
May 28 Javascript
jsonp跨域及实现百度首页联想功能的方法
Aug 30 Javascript
vuejs router history 配置到iis的方法
Sep 20 Javascript
JS highcharts实现动态曲线代码示例
Oct 16 Javascript
微信小程序开发打开另一个小程序的实现方法
May 17 #Javascript
微信小程序开发之获取用户手机号码(php接口解密)
May 17 #Javascript
关于AngularJS中几种Providers的区别总结
May 17 #Javascript
VueCli4项目配置反向代理proxy的方法步骤
May 17 #Javascript
JavaScript链式调用原理与实现方法详解
May 16 #Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
May 16 #Javascript
JavaScript接口实现方法实例分析
May 16 #Javascript
You might like
基于mysql的bbs设计(一)
2006/10/09 PHP
php通过array_push()函数添加多个变量到数组末尾的方法
2015/03/18 PHP
ThinkPHP路由详解
2015/07/27 PHP
php防止sql注入的方法详解
2017/02/20 PHP
PHP实现浏览器中直接输出图片的方法示例
2018/03/14 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
你需要知道的JavsScript可以做什么?
2007/06/29 Javascript
JQuery+DIV自定义滚动条样式的具体实现
2013/06/25 Javascript
浅析Node.js中的内存泄漏问题
2015/06/23 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
js/jq仿window文件夹移动/剪切/复制等操作代码
2017/03/08 Javascript
基于JSON数据格式详解
2017/08/31 Javascript
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
2017/09/10 Javascript
Javascript 严格模式use strict详解
2017/09/16 Javascript
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
vue iview实现动态路由和权限验证功能
2018/04/17 Javascript
微信小程序实现折线图的示例代码
2019/06/07 Javascript
如何使用three.js 制作一个三维的推箱子游戏
2020/07/29 Javascript
python实现协同过滤推荐算法完整代码示例
2017/12/15 Python
django加载本地html的方法
2018/05/27 Python
PyTorch CNN实战之MNIST手写数字识别示例
2018/05/29 Python
python如何读取bin文件并下发串口
2019/07/05 Python
django admin.py 外键,反向查询的实例
2019/07/26 Python
scikit-learn线性回归,多元回归,多项式回归的实现
2019/08/29 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
Pyqt5自适应布局实例
2019/12/13 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
瑞典多品牌连锁店:Johnells
2021/01/13 全球购物
公司人力资源的自我评价
2014/01/02 职场文书
商业项目策划方案
2014/06/05 职场文书
出国签证在职证明
2014/09/20 职场文书
城管执法人员个人对照检查材料思想汇报
2014/09/29 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
幼儿园推普周活动总结
2015/05/07 职场文书
修改MySQL的数据库引擎为INNODB的方法
2021/05/26 MySQL