这是苹果上的日历截图,从上面的内容来看,有公历,农历,24节气和节日。
遗憾的是目前还未找到 公历 和 农历 转换的公式;现阶段能够找到的开源的日历组件,基本上都是存了一份 农历 1900-2100 的润大小信息表,有兴趣的可以阅读下 农历编算法则 。
而节日相对而言会受到地区等因素影响,需要定时维护,所以实际上,我们在日历上真正能够计算并使用的只有 公历 和 24节气。
写日历需要解决的问题
1. 每周从什么时候开始?
这是因为不同的地区,每周开始的时间是不一样的,可以参考知乎的 一周的第一天是周一还是周日?
平时在使用实体日历的时候,的确是有些印刷的日历会从 星期一 开始,而使用电子产品的时候,大多数都是从 星期天 开始的。
不过这个问题还是比较好解决的,首先看下日历的头部。
从截图上看出,不管是那天开始,整体的顺序不变,而且有没有发现,这个情况和无缝滚动的组件很像,内容滚出视图外,自动补充到末尾,就像一个圆环。
那我们基于无缝滚动的原理,就很容易获得一周7天的数字。
既然原理分析出了,那我们就可以很容易的写出代码:
我们执行之后,基本上达到我们的预期。
那我们再进一步,转化成日历的头部,顺便支持国际化
打开 Chrome devtools
执行下,基本额可以达到我们的预期
2. 每个月的第一天不是周的开始
这个很正常,周的开始都不确定,何况是月天数不固定。
我们从上面的图也可以看出来,月结束和开始都不固定,那我们该如何处理?
其实这个也非常容易解决,我们先不从程序的角度思考,单纯从图片上思考下,是不是只要知道每个月的1号在处在星期中的那一天,在往前减去多少天,就可以计算出 1号所在星期 开始的时间。
可能又点绕,我们用图片说话:
那我们知道如何计算之后,就可以开始准备数据了。
首先我们需要知道,1号是星期几,这个在 js 中,直接通过 Date#getDay()
就可以知道是星期几
但因为前面说过了,周的开始是不固定的,所以我们计算的时候,还需要前面的函数辅助才能知道应该减少几天。
到这里可能会有人疑惑,每个月份的天数都不固定,而且还有润月的问题;就算我们知道要减少几天,计算上一个月的最后一天也是一个麻烦事情,这个应该如何解决呢?
其实这个也非常简单,在 js 中 Date
对象已经帮帮我们处理好了。
到这里我们所有的条件都已经准备完毕了,剩下的就交给循环了。
我们看下执行结果
试试周一开始
目前看来,日期和星期都按我们预想的那样执行了,剩下的就是渲染问题。
渲染日历
其实当我们数据准备好的那一刻,基本上这个日历也就差不多完成了,剩下的是往上面堆功能。
我们只要数据处理好,那我们就可以使用任何框架,甚至在任何支持 Date
对象的 js 环境中运行了,比如在 nodejs 上运行。
所有代码都在这里:完整代码
用 nodejs >= 12.x
试试:
打印 2021-01 月,以周日开始的日历
打印 2021-01 月,以周一开始的日历
渲染到 html 上
结束
农历和节假日可以通过数据的方式手动维护,不过节气可以维护到组件中。
写一个日历,也是一件比较麻烦的事情,幸好大部分前端用到的日历都不要求 农历,24节气 和 节日,不然头发都要多掉好几根。
如果自己维护日历数据的模块,可以试试我发布的包:@zhengxs/calendar-data,欢迎 fork
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!