js实现日历的简单算法


Posted in Javascript onJanuary 24, 2017

最近有用到日历可需要编辑文本的日历,为了绑定数据的方便,所以用js写了一套日历,其实思想也是很简单。

实现步骤如下:

1、首先取得处理月的总天数

JS不提供此参数,我们需要计算。考虑到闰年问题会影响二月份的天数,我们先编写一个判断闰年的自编函数:

function is_leap(year) {
 return (year%100==0?res=(year%400==0?1:0):res=(year%4==0?1:0));
}

 2、接着定义一个包含十二个月在内的月份总天数的数组:

m_days=new Array(31,28+is_leap(ynow),31,30,31,31,30,31,30,31,30,31);

3、m_days这个数组里,二月份的天数已经加入闰年的信息:28+is_leap(ynow) 。数组元素从0开始,正好对应于JS提供的Date函数提供的getMonth返回值,即0表示一月,1表示二月,2表示三月,依此类推。

这样,各月总数可以这样取得:m_days[x]。其中,x为0至11的自然数。 

4、计算处理月第一天是星期几

可以使用Date函数的getDay取得,返回的值从0到6,0表示星期一,1表示星期二,2表示星期三,其余依此类推。代码如下(假设要处理的时间为2008年3月):

n1str=new Date(2008,3,1);
firstday=n1str.getDay();

有了月总天数和该月第一天是星期几这两个已知条件,就可以解决表格所需行数问题:(当前月天数+第一天是星期几的数值)除以七。表格函数需要整数,因此,我们使用Math.ceil来处理:

tr_str=Math.ceil((m_days[mnow] + firstday)/7);

表格中的tr标签实际上代表表格的行,因此变量tr_str是我们往下写表格的重要依据。

5、打印日历表格

可以使用两个for语句嵌套起来实现:外层for语句写行,内层for语句写单元格。

for(i=0;i<tr_str;i++) { //表格的行
for(k=0;k<7;k++) { //表格每行的单元格


idx=i*7+k; //单元格自然序列号


date_str=idx-firstday+1; //计算日期


(date_str<=0 || date_str>m_days[mnow]) ? date_str=" " : date_str=idx-firstday+1; //过滤无效日期(小于等于零的、大于月总天数的)


$(".date-info .date").last().append("<td class='day'>" + date_str + "</td>");

}
}

单元格的自然序号是否代表有效日期非常关键,为此必须加入一个过滤机制:仅打印有效的日期。有效的日期大于0小于小于等于处理月的总天数。 

6、上一个月与下一个月

if(mnow<=0){
mnow=11;

ynow=ynow-1;
}else{

mnow--;
}

if(mnow>=11){

mnow=0;

ynow=ynow+1;
}else{

mnow++;
}

获取上一个月时,到1月份需注意;获取下一个月时,到12月份时要注意。

渲染时,需要先移除旧的日历,再添加新的日历。

var nstr = new Date();
var ynow = nstr.getFullYear();
var mnow = nstr.getMonth();
var dnow = nstr.getDate();
var mnow_real = mnow;
calendar(nstr,ynow,mnow,dnow);
monDetail(ynow,mnow_real);

function monDetail(ynow,mnow){
 mnow_real = mnow+1;
 $(".month-detail").html(ynow+"-"+ mnow_real); //显示当前年月
}

function is_leap(year) { //判断是否为闰年
 return (year%100==0?res=(year%400==0?1:0):res=(year%4==0?1:0));
}

function preMonth(){ //上一个月
 console.log(mnow);
 if(mnow<=0){
 mnow=11;
 ynow=ynow-1;
 }else{
 mnow--;
 } 
 calendar(nstr,ynow,mnow,dnow);
 monDetail(ynow,mnow);
}

function nextMonth(){ //下一个月

 if(mnow>=11){
 mnow=0;
 ynow=ynow+1;
 }else{
 mnow++;
 }
 calendar(nstr,ynow,mnow,dnow);
 monDetail(ynow,mnow);

}

function calendar(nstr,ynow,mnow,dnow){
 $(".date-info tr.date").remove(); /改变月份时,先移除旧的日期
 var nlstr = new Date(ynow,mnow,1); //当月第一天
 var firstday = nlstr.getDay(); //第一天星期几

 var m_days=new Array(31,28+is_leap(ynow),31,30,31,31,30,31,30,31,30,31); //每个月的天数

 var tr_str=Math.ceil((m_days[mnow] + firstday)/7); //当前月天数+第一天是星期几的数值 获得 表格行数
 var i,k,idx,date_str;
 for(i=0;i<tr_str;i++) { //表格的行
 $(".date-info tbody").append("<tr class='date'></tr>");
 for(k=0;k<7;k++) { //表格每行的单元格
 idx=i*7+k; //单元格自然序列号
 date_str=idx-firstday+1; //计算日期
 (date_str<=0 || date_str>m_days[mnow]) ? date_str=" " : date_str=idx-firstday+1; //过滤无效日期(小于等于零的、大于月总天数的)
 $(".date-info .date").last().append("<td class='day'>" + date_str + "</td>");
 }
 
 }
}

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

Javascript 相关文章推荐
Javascript+XMLHttpRequest+asp.net无刷新读取数据库数据
Aug 09 Javascript
Riot.js 快速的JavaScript单元测试框架
Nov 09 Javascript
通过DOM脚本去设置样式信息
Sep 19 Javascript
json2.js的初步学习与了解
Oct 06 Javascript
js中的如何定位固定层的位置
Jun 15 Javascript
详解JavaScript基于面向对象之创建对象(1)
Dec 10 Javascript
Bootstarp风格的toggle效果分享
Feb 23 Javascript
AngularJs expression详解及简单示例
Sep 01 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
Dec 08 Javascript
浅谈Node.js 中间件模式
Jun 12 Javascript
解决Vue2.0中使用less给元素添加背景图片出现的问题
Sep 03 Javascript
React项目动态设置title标题的方法示例
Sep 26 Javascript
JSON键值对序列化和反序列化解析
Jan 24 #Javascript
js自制图片放大镜功能
Jan 24 #Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
Jan 24 #Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
Jan 24 #Javascript
JavaScript解析JSON格式数据的方法示例
Jan 24 #Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
Jan 24 #Javascript
Jquery树插件zTree实现菜单树
Jan 24 #Javascript
You might like
聊天室php&amp;mysql(二)
2006/10/09 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
2016/03/30 PHP
PHP类的特性实例分析
2016/09/28 PHP
关于laravel框架中的常用目录路径函数
2019/10/23 PHP
Prototype使用指南之selector.js说明
2008/10/26 Javascript
ko knockoutjs动态属性绑定技巧应用
2012/11/14 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
IE下JS读取xml文件示例代码
2013/08/05 Javascript
JS取request值以及自动执行使用示例
2014/02/24 Javascript
JS+CSS实现的经典tab选项卡效果代码
2015/09/16 Javascript
jQuery学习笔记之Ajax用法实例详解
2015/12/01 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
2016/05/18 Javascript
基于jQuery实现中英文切换导航条效果
2016/09/18 Javascript
jQuery实现给input绑定回车事件的方法
2017/02/09 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
AngularJS实现页面定时刷新
2017/03/14 Javascript
微信小程序 商城开发(ecshop )简单实例
2017/04/07 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
springmvc接收jquery提交的数组数据代码分享
2017/10/28 jQuery
js表达式与运算符简单操作示例
2020/02/15 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
Python 类的继承实例详解
2017/03/25 Python
Python 基础之字符串string详解及实例
2017/04/01 Python
Python用imghdr模块识别图片格式实例解析
2018/01/11 Python
python版大富翁源代码分享
2018/11/19 Python
Django框架实现的简单分页功能示例
2018/12/04 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
2020/01/25 Python
Python将字典转换为XML的方法
2020/08/01 Python
中学生纪念九一八事变演讲稿
2014/09/14 职场文书
医院志愿者活动总结
2015/05/06 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
五年级作文之学校的四季
2019/12/05 职场文书
详解Spring Security中的HttpBasic登录验证模式
2022/03/17 Java/Android
解决xampp安装后Apache无法启动
2022/03/21 Servers
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS