起因
个人在辅助小孩写作业过程中,偶尔会有需求知道今天是单周还是双周。好决定带什么内容的课本。
这个功能对于我来说,并非刚需,也是偶发的。而且感觉也不会太难,于是就起了自己做一个“在线小工具”的念头。
操作简单,直接选择下“开始日期”和“计算日期”,点下按钮就可以了。
大家可以体验下(在线小工具:JSON 转换 Excel;单双周计算; - Development Environment)
硬货
以下是主要代码
calc方法获取和“计算日期”和“开始日期”,进行了计算,并将结果输出到页面。
function calc() {
let weeks = weeksBetweenDatesByYearWeek(vm.week.endDate, vm.week.startDate);
vm.error = "相差周数为:" + weeks;
}
weeksBetweenDatesByYearWeek方法,接受两个日期,计算周数差异。
function weeksBetweenDatesByYearWeek(date1, date2) {
const week1 = getWeekOfYear(date1);
const week2 = getWeekOfYear(date2);
// 返回周数差异(注意处理跨年情况,这里假设date2在date1之后)
return Math.abs(week2 - week1);
}
getWeekOfYear方法用于获取某个日期在本年度的周数。
function getWeekOfYear(date) {
// 创建一个与给定日期相同但时间为当天的00:00:00的副本
const startOfDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
// 获取当年1月1日是星期几(0代表星期日,6代表星期六)
const startOfYearDay = new Date(date.getFullYear(), 0, 1).getDay();
// 计算从当年1月1日到给定日期的天数偏移量
let dayOfYear = Math.floor((startOfDate - new Date(date.getFullYear(), 0, 1)) / (1000 * 60 * 60 * 24));
// 根据ISO 8601,如果1月1日不是星期一,则需要调整偏移量
if (startOfYearDay <= 4) {
dayOfYear += startOfYearDay;
} else {
dayOfYear += startOfYearDay - 7;
}
// 返回周数(ISO周数是从1开始的)
return Math.ceil(dayOfYear / 7);
}