当前位置:首页 > 日记 > 正文

js实现日历的简单算法

js实现日历的简单算法

最近有用到日历可需要编辑文本的日历,为了绑定数据的方便,所以用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>"); }  }}

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

相关文章

QQ怎么打开临时会话功能QQ开启临时

QQ怎么打开临时会话功能QQ开启临时

方法,屏蔽,教程,功能,电脑软件,  临时会话功能是针对双方非对方QQ好友进行对话的一个功能,我们怎么打开临时会话的功能呢?下面是小编为大家整编的QQ开启临时会话的教程,大家快来看看吧。QQ打开临时会话功能的方法1、登录QQ,点击打开系统设置2…

excel表格如何保留两位小数点

excel表格如何保留两位小数点

保留两位小数,设置,方法,表格,电脑软件,  excel是工作中最常用到的表,如果在对数据进行接触的过程中遇到小数点后出现很多位,怎么设置表格保留两位小数呢?接下来小编举例简单的例子告诉大家Excel表格设置保留两位小数的方法吧。Excel表格设…

如何使用ppt破解加密演示文稿

如何使用ppt破解加密演示文稿

加密,破解,演示文稿,如何使用,电脑软件,  在平时的生活中,我们经常会使用到PPT软件,如果我们之前加密的文稿忘记了密码,有破解的方法吗?以下是小编为您带来的关于使用ppt破解加密演示文稿,希望对您有所帮助。使用ppt破解加密演示文稿1:找到你…

wps文字怎么上传文件

wps文字怎么上传文件

文字,上传文件,方法,上传,文件,  wps的云文档功能是可以将我们是所编辑的文档上传到云端,上传到云端的文档是可以在移动设备上查看的。那么我们怎么上传云文件呢?下面就让小编告诉你wps如何上传云文件,希望小编整理的资料对大家有帮助。wps…

excel怎样用if函数自动填充颜色

excel怎样用if函数自动填充颜色

函数,自动填充,方法,颜色,电脑软件,  Excel中如何用if函数进行颜色的填充呢?其实我们可以利用函数来设置填充,下面是小编带来的关于excel 用if函数填充颜色的教程,欢迎大家来到学习。excel用if函数自动填充颜色的方法用if函数填充颜色步骤1…

JS回调函数基本定义与用法实例分析

JS回调函数基本定义与用法实例分析

实例分析,回调函数,定义,电脑软件,JS,本文实例讲述了JS回调函数基本定义与用法。分享给大家供大家参考,具体如下:初学js的时候,被回调函数搞得很晕,现在回过头来总结一下什么是回调函数。我们先来看看回调的英文定义:A callback is a function t…

word2013怎样设置修改和删除文件密

word2013怎样设置修改和删除文件密

删除文件,设置,修改,密码,电脑软件,  Microsoft Office 2013版本的的办公软件界面发生了一些变化,本经验以Word 2013为例,讲解如何设置、修改、删除文件的密码,其它文档(EXCEL、PPT)方法类似。那么下面就由小编为您提供更具体的操作吧,有需要…

怎样自定义Excel2007快速访问工具

怎样自定义Excel2007快速访问工具

工具栏,自定义,快速,电脑软件,  在Excel 2007中,用户可以根据自己的操作需要,随时可对&ldquo;快速访问工具栏&rdquo;进行定义操作,如添加/删除工具栏中的命令按钮、创建个性化的工具栏等。以下是小编为您带来的关于自定义Excel2007快速访问…

Excel如何隔列插入多列空白列

Excel如何隔列插入多列空白列

多列,空白,电脑软件,Excel,  对于Excel表格的运用,如果我们现在需要隔列添加多列空白列,我们只能一列一列插入吗?不一定,可以在Excel表格中快速的添加多列空白列。以下是小编为您带来的关于Excel隔列插入多列空白列,希望对您有所帮助。Excel…

word2016文档调整文件大小有什么方

word2016文档调整文件大小有什么方

调整,方法,文件大小,文档,有什么,  有的朋友表示word文件太大,不方便上传文件保存,怎么才能调整文件变小。以下是小编为您带来的关于word2016调整文件大小方法,希望对您有所帮助。word2016调整文件大小方法在Word文档中,点击上面的&ldquo;文…

撤销excel工作表保护的方法怎么撤

撤销excel工作表保护的方法怎么撤

方法,密码保护,工作,电脑软件,excel,  在Excel中录入好重要的数据以后都需要进行工作表的密码保护,或许过了段时间后数据不再重要了就可以撤销工作表保护了,可能有的朋友还不会如何撤销工作表的保护。下面是小编带来的关于如何撤销excel工…

Mac系统下Webstorm快捷键整理大全

Mac系统下Webstorm快捷键整理大全

快捷键,系统,大全,电脑软件,Mac,前言用Webstorm来调试Node代码简直太赞了,断点调试、属性方法快速等特性让我快速脱离了用Sublime text + node-inspector那种刀耕火种的痛苦状态,幸福指数嗖嗖嗖的就上来了~~~~不吹捧啦,但是做Node开发的话,建议…