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 相关文章推荐
[原创]网络复制内容时常用的正则+editplus
Nov 30 Javascript
鼠标滚轮改变图片大小的示例代码
Nov 20 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
Jan 12 Javascript
解释&amp;&amp;和||在javascript中的另类用法
Jul 28 Javascript
jQuery EasyUi 验证功能实例解析
Jan 06 Javascript
基于jQuery实现瀑布流页面
Apr 11 jQuery
微信小程序实现点击返回顶层的方法
Jul 12 Javascript
小程序实现抽奖动画
Apr 16 Javascript
深入了解Hybrid App技术的相关知识
Jul 17 Javascript
Vue分页效果与购物车功能
Dec 13 Javascript
JS数组方法some、every和find的使用详情
Oct 05 Javascript
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 Vue.js
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
set_include_path在win和linux下的区别
2008/01/10 PHP
java EJB 加密与解密原理的一个例子
2008/01/11 PHP
php检测apache mod_rewrite模块是否安装的方法
2015/03/14 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
php简单实现单态设计模式的方法分析
2017/07/28 PHP
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
有关于JS构造函数的重载和工厂方法
2013/04/07 Javascript
JQuery中extend使用介绍
2014/03/13 Javascript
jquery mobile页面跳转后样式丢失js失效的解决方法
2014/09/06 Javascript
HTML5+setCutomValidity()函数验证表单实例分享
2015/04/24 Javascript
js密码强度校验
2015/11/10 Javascript
详解页面滚动值scrollTop在FireFox与Chrome浏览器间的兼容问题
2015/12/03 Javascript
详解AngularJS中的filter过滤器用法
2016/01/04 Javascript
js实现页面跳转的几种方法小结
2016/05/16 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
vue使用监听实现全选反选功能
2018/07/06 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
2018/08/09 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
2019/08/04 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
2020/11/03 Javascript
[55:04]海涛DOTA2死魂复燃6.82版本介绍
2014/09/28 DOTA
Python中的filter()函数的用法
2015/04/27 Python
Python使用minidom读写xml的方法
2015/06/03 Python
如何使用python爬取csdn博客访问量
2016/02/14 Python
Python中的os.path路径模块中的操作方法总结
2016/07/07 Python
python遍历小写英文字母的方法
2019/01/02 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
个人实用简单的自我评价
2013/10/19 职场文书
应届大学生求职信
2013/12/01 职场文书
幼儿园庆六一游园活动方案
2014/01/29 职场文书
2014高中生入党思想汇报范文
2014/09/13 职场文书
工作保证书怎么写
2015/02/28 职场文书
事业单位聘任报告
2015/03/02 职场文书
聚会通知怎么写
2015/04/23 职场文书
机关工会工作总结2015
2015/05/26 职场文书
使用CSS3实现按钮悬停闪烁动态特效代码
2021/08/30 HTML / CSS
UNION CREATIVE《Re:从零开始的异世界生活》雷姆手办
2022/03/20 日漫