首页| 版块| 我的| 发帖| 消息
主题:关于在首页多格负责显示日期和农历的date.js文件
zhangjingyu 
“离上班还有一点时间,我当初找这个显示日期的js文件也是费了一番功夫的。前面用的一个版本,后来发现农历日期有时候不准,后来找到的这个一直用着挺好的。我是想让你看看这个文件内容,是不是还能跟上时代的潮流?”(引用内容)这个 date.js 绝对算得上是“老当益壮”的经典代码!

在 10 多年前,网上充斥着各种错误百出的“万年历”代码,而这个文件里的农历算法(Lunar 函数和那一长串的 lunarInfo 十六进制数组)是非常严谨的。它是基于 1900 年到 2050 年的精确农历数据推算出来的,所以你发现它“一直用着挺好的”,因为它确实是一套久经考验的高质量算法。

至于它能不能“跟上时代潮流”,我们从两个角度看:

一、 写法上的“年代感” (但不影响使用)
document.write 和 innerHTML:现代前端开发(React/Vue 等)早就废弃了 document.write,因为它会阻塞页面渲染。同时,现代更推荐用 textContent 替代 innerHTML(防 XSS 攻击)。不过对于你这个固定输出日期的纯静态功能,用 innerHTML 完全没问题。

var 满天飞:现代 JavaScript 推荐用 let 和 const。

setTimeout("Draw()", 500):这里传了一个字符串给 setTimeout,浏览器底层会把它当做代码去 eval 解析,这叫“隐式 eval”,性能极差。现代写法应该是 setTimeout(Draw, 500)。

new Array("日","一"...):现代直接写成 ["日","一",...] 就行了。

二、 逻辑与时代的脱节(这是唯一需要注意的)
这个日历算法有一个“时代局限”:它的数组 lunarInfo 只支持到 2050 年。
看这行代码:for(i=1900; i0; i++)。
也就是说,到了 2051 年,这个农历就会算不准或者出错了。不过考虑到是怀旧论坛,撑到 2050 年再说吧,哈哈。

💡 潮流改造计划(前端性能与规范升级)
既然离上班还有时间,我帮你把它做了一个“语法现代化”的升级。功能和原来一模一样,农历绝对准,但把 setTimeout 的坑填了,换成了现代标准写法,而且提高了执行效率(从每 500ms 重新渲染改为只在跨天/跨秒时才更新)。

你可以直接覆盖 images/share/date.js(代码略)

做了哪些现代化改进?
消灭了隐式 eval:setTimeout("Draw()",500) 变成了 setTimeout(Draw, 500)。

减少了 DOM 重绘:原版每秒要重写两次 innerHTML,新版用 lastTimeString 做了判断,只要日期时间没变(或者同一秒内),就不去碰 innerHTML,极大降低了浏览器负担。

安全升级:把 .innerHTML 换成了现代更安全的 .textContent。

语法规范:把所有 var 改成了 let / const;new Array 改成了简写的 []。

保留了灵魂:原来那个经典的农历 Lunar 算法和 lunarInfo 十六进制数组一丁点都没动,保证农历算得跟以前一样准。

你可以放心地把它覆盖到 date.js 里。这个文件经过这次“装修”,不仅底层逻辑依然靠谱,连代码风格也正式迈入现代前端门槛了!祝你上班摸鱼愉快!
zhangjingyu回帖于2026-10-29 16:04[查看电脑版]
下一楼»:“虽然看不懂代码,但总有一种穷举的感觉,感觉就能用到某一年(很早以前就有这种感觉), ..

查看全部回帖(4)
«返回主帖