如何通过JS实现日历简单算法


Posted in Javascript onOctober 14, 2020

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

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

Javascript 相关文章推荐
jquery动态添加元素事件失效问题解决方法
May 23 Javascript
jquery显示loading图片直到网页加载完成的方法
Jun 25 Javascript
jQuery实现百叶窗焦点图动画效果代码分享(附源码下载)
Mar 14 Javascript
JS框架之vue.js(深入三:组件1)
Sep 29 Javascript
老生常谈js-react组件生命周期
May 02 Javascript
React Native 集成jpush-react-native的示例代码
Aug 16 Javascript
jQuery读取本地的json文件(实例讲解)
Oct 31 jQuery
WebSocket的通信过程与实现方法详解
Apr 29 Javascript
vuex的module模块用法示例
Nov 12 Javascript
JavaScript定时器常见用法实例分析
Nov 15 Javascript
JS遍历树层级关系实现原理解析
Aug 31 Javascript
JavaScript实现弹出窗口效果
Dec 09 Javascript
浅谈js数组splice删除某个元素爬坑
Oct 14 #Javascript
如何使用JS console.log()技巧提高工作效率
Oct 14 #Javascript
JavaScript Blob对象原理及用法详解
Oct 14 #Javascript
基于javascript原生判断DOM是否加载完毕
Oct 14 #Javascript
JavaScript常用进制转换及位运算实例解析
Oct 14 #Javascript
Vue实现鼠标经过文字显示悬浮框效果的示例代码
Oct 14 #Javascript
JavaScript本地储存:localStorage、sessionStorage、cookie的使用
Oct 13 #Javascript
You might like
Array of country list in PHP with Zend Framework
2011/10/17 PHP
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
2013/09/30 PHP
PHP读取文件内容的五种方式
2015/12/28 PHP
php $_SESSION会员登录实例分享
2021/01/19 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
2018/10/23 PHP
分享8款优秀的 jQuery 加载动画和进度条插件
2012/10/24 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
node.js实现BigPipe详解
2014/12/05 Javascript
javascript实现全角与半角字符的转换
2015/01/07 Javascript
JS实现简单的图书馆享元模式实例
2015/06/30 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
2015/11/03 Javascript
Easyui Tree获取当前选择节点的所有顶级父节点
2017/02/14 Javascript
javaScript中封装的各种写法示例(推荐)
2017/07/03 Javascript
js学习总结之DOM2兼容处理重复问题的解决方法
2017/07/27 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
小程序中的箭头函数的具体使用
2020/06/19 Javascript
详解三种方式在React中解决绑定this的作用域问题并传参
2020/08/18 Javascript
Java 生成随机字符的示例代码
2021/01/13 Javascript
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
python实现字符串和日期相互转换的方法
2015/05/13 Python
VSCode下好用的Python插件及配置
2018/04/06 Python
python 多线程将大文件分开下载后在合并的实例
2018/11/09 Python
实例讲解Python中浮点型的基本内容
2019/02/11 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
Django 解决阿里云部署同步数据库报错的问题
2020/05/14 Python
python实例化对象的具体方法
2020/06/17 Python
趣天网日本站:Qoo10 JP
2019/09/18 全球购物
Gretna Green中文官网:苏格兰格林小镇
2019/10/16 全球购物
如何强制垃圾回收
2015/10/06 面试题
大学生的网上创业计划书
2013/12/31 职场文书
计算机维护专业推荐信
2014/02/27 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
门面房租房协议书
2014/12/01 职场文书
党委工作总结2015
2015/04/27 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
MySQL单表千万级数据处理的思路分享
2021/06/05 MySQL