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 支持链式调用的异步调用框架Async.Operation
Aug 04 Javascript
jQuery绑定事件的几种实现方式
May 09 Javascript
JavaScript仿淘宝页面图片滚动加载及刷新回顶部的方法解析
May 24 Javascript
javascript实现粘贴qq截图功能(clipboardData)
May 29 Javascript
浅谈Node.js:Buffer模块
Dec 05 Javascript
bootstrap日期控件问题(双日期、清空等问题解决)
Apr 19 Javascript
ionic2自定义cordova插件开发以及使用(Android)
Jun 19 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
Oct 08 Javascript
史上最为详细的javascript继承(推荐)
May 18 Javascript
更优雅的微信小程序骨架屏实现详解
Aug 07 Javascript
layer ui插件显示tips时,修改字体颜色的实现方法
Sep 11 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
Sep 16 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设计模式 Interpreter(解释器模式)
2011/06/26 PHP
迅速确定php多维数组的深度的方法
2014/01/07 PHP
php使用百度天气接口示例
2014/04/22 PHP
php检查字符串中是否包含7位GSM字符的方法
2015/03/17 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
jQuery on()方法示例及jquery on()方法的优点
2015/08/27 Javascript
jQuery CSS3自定义美化Checkbox实现代码
2016/05/12 Javascript
Node.js中process模块常用的属性和方法
2016/12/13 Javascript
vue 做移动端微信公众号采坑经验记录
2018/04/26 Javascript
js实现左右两侧浮动广告
2018/07/09 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
JavaScript原型式继承实现方法
2019/11/06 Javascript
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
Python将xml和xsl转换为html的方法
2015/03/10 Python
分析并输出Python代码依赖的库的实现代码
2015/08/09 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
2018/01/04 Python
python爬虫基本知识
2018/03/05 Python
Python for循环中的陷阱详解
2018/07/13 Python
Python Pywavelet 小波阈值实例
2019/01/09 Python
pycharm 批量修改变量名称的方法
2019/08/01 Python
Django实现发送邮件找回密码功能
2019/08/12 Python
Python坐标线性插值应用实现
2019/11/13 Python
巧用CSS3 border实现图片遮罩效果代码
2012/04/09 HTML / CSS
J.Crew官网:美国知名休闲服装品牌
2017/05/19 全球购物
自1926年以来就为冰岛保持温暖:66°North
2020/11/27 全球购物
单位单身证明范本
2014/01/11 职场文书
大学旷课检讨书
2014/01/28 职场文书
一名老师的自我评价
2014/02/07 职场文书
管理部副部长岗位职责范文
2014/03/09 职场文书
开展批评与自我批评心得体会
2014/10/17 职场文书
房屋租房协议书范本
2014/12/04 职场文书
2014年留守儿童工作总结
2014/12/10 职场文书
单位接收函范文
2015/01/30 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
浅谈由position属性引申的css进阶讨论
2021/05/25 HTML / CSS