用JavaScript如何写周日历,代码是什么
Admin 2022-08-06 群英技术资讯 827 次浏览
这篇文章主要讲解了“用JavaScript如何写周日历,代码是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“用JavaScript如何写周日历,代码是什么”吧!所以,阳历、阴历是一类历法,而公历、农历是一种历法。公历和农历的表述方法也是不一样的
好吧,以前总觉得公历就是阳历,农历就是阴历。实际上只是老百姓这样说。从理论上是无法等同的。
我们熟知的是公历,公历分为周期为 365个日历日的平年以及周期为 366个 日历日的闰年。闰年是能被 4 整除的年, 然而,百年并不一定是闰年,除非它们能被 400整除。
公历是一种历法系统,其中的年又叫日历年,日又叫日历日。这种历法系统由一系列连续的日历年(可能是无限的)组成,其中每年又划分成 12个顺序的日历月。
周日历是日常生活中不常用到的历法系统,一般用于政府、商务的会计年度或者学校教学日历中。
国际标准ISO 8601(数据存储和交换形式·信息交换·日期和时间的表示方法)中定义的ISO周日历系统:
国内是采用【GB/T 7408-2005/ISO 8601:2000】标准(位于 4.3.2.2 日历星期,实际上还是采用的ISO 8601:2000年版本的标准)。定义如下:
书写格式
公历中的2019年12月30日星期一是ISO日历中2020年第1周的第一天,写为2020-W01-1或2020W011。
每年的第一个日历星期有以下四种等效说法
推理可得:

一周的开始是星期一还是星期日
按照国际标准 ISO 8601 的说法,星期一是一周的开始,而星期日是一周的结束。虽然已经有了国际标准,但是很多国家,比如「美国」、「加拿大」和「澳大利亚」等国家,依然以星期日作为一周的开始。
所以在计算一年的第一周的时候,国内日历和欧美一些国家存在差异。
长年,是有53星期的年

(符号向上取整)
/**
* 根据年份计算当年周数
* @param {number} y 年
*/
function computeWeeks(y) {
const leapDay = p(y) === 4 || p(y - 1) === 3 ? 1 : 0
return 52 + leapDay;
}
function p(y) {
return (y + Math.ceil(y / 4) + Math.ceil(y / 100) + Math.ceil(y / 400)) % 7;
}
/**
* 实际上 JavaScript 中获取一年的周数更简单
* 12月28日所在的周数,始终是一年中的最后一周
* 求出12月28日是星期几,如果早于或等于周四,那该年有53周
* Date.prototype.getDay 结果中 0 表示星期天
* @param {number} y 年份
*/
function getWeeks(y) {
const day = new Date(`${y}/12/28`).getDay();
return day !== 0 && day <= 4 ? 53 : 52
}
来自The Mathematics of the ISO 8601 Calendar
/**
* 计算自0年1月0日起,CE的天数(Gregorian)
*/
function gregdaynumber(year, month, day) {
y = year;
m = month;
if (month < 3) y = y - 1;
if (month < 3) m = m + 12;
return Math.floor(365.25 * y) - Math.floor(y / 100) + Math.floor(y / 400) + Math.floor(30.6 * (m + 1)) + day - 62;
}
/**
* 根据当前公历日期计算ISO日历日期
*/
function isocalendar1() {
var today = new Date();
year = today.getFullYear();
month = today.getMonth(); // 0=January, 1=February, etc.
day = today.getDate();
wday = today.getDay();
weekday = ((wday + 6) % 7) + 1; // getDay 返回的值是 0 ~ 6,这里转为1 ~ 7
isoyear = year;
d0 = gregdaynumber(year, 1, 0);
weekday0 = ((d0 + 4) % 7) + 1;
d = gregdaynumber(year, month + 1, day);
isoweeknr = Math.floor((d - d0 + weekday0 + 6) / 7) - Math.floor((weekday0 + 3) / 7);
// 检查12月的最后几天是否属于下一年的ISO周
if ((month == 11) && ((day - weekday) > 27)) {
isoweeknr = 1;
isoyear = isoyear + 1;
}
// 检查一月的前几天是否属于上一年的ISO周
if ((month == 0) && ((weekday - day) > 3)) {
d0 = gregdaynumber(year - 1, 1, 0);
weekday0 = ((d0 + 4) % 7) + 1;
isoweeknr = Math.floor((d - d0 + weekday0 + 6) / 7) - Math.floor((weekday0 + 3) / 7);
isoyear = isoyear - 1;
}
if (isoweeknr < 10) return isoyear + "-W0" + isoweeknr + "-" + weekday;
if (isoweeknr > 9) return isoyear + "-W" + isoweeknr + "-" + weekday;
}

(weeks是第一个计算中的方法)
常数 10
woy 指 week of year
doy 指 day of the year,就是当年的第几天,取值doy = 1 → 365/366
dow 值 day of the week,就是星期几。使用JavaScript的 Date.prototype.getDay 方法取值范围为 0到6,对应周日到周六,但是dow 的值范围为 1~7,需要相应转换
如果这样获得的星期数等于0,则意味着给定的日期属于上一个(基于周)的年份
如果获得的星期数为53,则必须检查日期是否是第二年的第1周
每月基于1月1日的偏移量
| 月 | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 平年 | 0 | 31 | 59 | 90 | 120 | 151 | 181 | 212 | 243 | 273 | 304 | 334 |
| 闰年 | 0 | 31 | 60 | 91 | 121 | 152 | 182 | 213 | 244 | 274 | 305 | 335 |
例如查找2016年11月5日星期六的星期数
// 使用每月基于当年的1月1日的偏移量计算 woy = Math.floor((10 + (305 + 5) − 6) / 7) woy = Math.floor(314 / 7) = 44 // 既不是 0 也不是 53,所以就是当前周数
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
私有变量的概念是,在任何函数中定义的变量,都是私有变量,因为不能在函数外部访问这些变量。与其他Java,C++语言等不同,在JavaScript中是没有私有属性的不能用关键字来声明的私有变量。在JavaScript是没有私有属性的概念的,所有属性都是公用的。
什么是单点登录?下面本篇文章给大家给大家介绍一下单点登录原理,聊聊使用Node实现单点登录SSO的方法,希望对大家有所帮助! 什么是单点登录 随着公司业务的增多,必然会产生各
这篇文章主要为大家详细介绍了Vue实现无限加载瀑布流,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
前端页面倒计时功能在很多场景中会用到,如很多秒杀活动等,本文主要介绍了用JS写了一个30分钟倒计时器的实现示例,感兴趣的可以了解一下
目录表单校验背景常规写法:策略模式介绍真实世界类比更广义的“算法”策略模式的组成利用策略模式改写策略模式优缺点优点:缺点:策略模式适合应用场景总结表单校验背景假设我们正在编写一个注册页面,在点击注册按钮之时,有如下几条校验逻辑:用户名不能为空密码长度不能少于6位手机号码必须符合格式常规写法:const form = d
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008