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 相关文章推荐
Javascript里使用Dom操作Xml
Sep 20 Javascript
prototype.js的Ajax对象
Sep 23 Javascript
为Javascript中的String对象添加去除左右空格的方法(示例代码)
Nov 30 Javascript
Js冒泡事件详解及阻止示例
Mar 21 Javascript
window.print打印指定div指定网页指定区域的方法
Aug 04 Javascript
创建、调用JavaScript对象的方法集锦
Dec 24 Javascript
javascript二维数组转置实例
Jan 22 Javascript
基于js实现投票的实例代码
Aug 04 Javascript
js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
Sep 14 Javascript
JS实现获取word文档内容并输出显示到html页面示例
Jun 23 Javascript
node.js 模块和其下载资源的镜像设置的方法
Sep 06 Javascript
微信小程序 可搜索的地址选择实现详解
Aug 28 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
解析获取优酷视频真实下载地址的PHP源代码
2013/06/26 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
thinkphp,onethink和thinkox中验证码不显示的解决方法分析
2016/06/06 PHP
php mongodb操作类 带几个简单的例子
2016/08/25 PHP
PHP中PCRE正则解析代码详解
2019/04/26 PHP
禁止js文件缓存的代码
2010/04/09 Javascript
使用node.js 制作网站前台后台
2014/11/13 Javascript
javascript+HTML5的canvas实现七夕情人节3D玫瑰花效果代码
2015/08/04 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
2016/07/10 Javascript
jQuery表单验证简单示例
2016/10/17 Javascript
jQuery File Upload文件上传插件使用详解
2016/12/06 Javascript
vue-resource调用promise取数据方式详解
2017/07/21 Javascript
详解使用webpack打包编写一个vue-toast插件
2017/11/08 Javascript
浅谈React碰到v-if
2018/11/04 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
解决Layui数据表格显示无数据提示的问题
2019/11/14 Javascript
Python实现文件内容批量追加的方法示例
2017/08/29 Python
对python sklearn one-hot编码详解
2018/07/10 Python
Python SQL查询并生成json文件操作示例
2018/08/17 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
详解js文件通过python访问数据库方法
2019/03/03 Python
Python 求数组局部最大值的实例
2019/11/26 Python
Python使用graphviz画流程图过程解析
2020/03/31 Python
5分钟弄清楚html5的drag and drop(小结)
2019/04/10 HTML / CSS
华为旗下电子商务平台:华为商城
2016/08/06 全球购物
美国本地交易和折扣网站:LocalFlavor.com
2017/10/26 全球购物
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
英文版银行求职信
2013/10/09 职场文书
学生爱国演讲稿
2014/01/14 职场文书
爷爷追悼会答谢词
2014/01/24 职场文书
机房搬迁方案
2014/05/01 职场文书
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
成都人事代理协议书
2014/10/25 职场文书
2014年体检中心工作总结
2014/12/23 职场文书
爱护环境建议书
2015/09/14 职场文书
谢师宴家长答谢词
2015/09/30 职场文书