📅  最后修改于: 2023-12-03 15:37:22.106000             🧑  作者: Mango
在许多应用程序和网站中,需要根据当前日期计算当前的周数,以便在周报、日历等方面进行使用。在 JavaScript 中,我们可以使用一些方法来计算当前的周数。
JavaScript 有一个内置的 Date 对象,可以通过它来获取当前的日期和时间。我们可以使用 Date 对象的 getDay() 方法来获取当前日期是周几,使用 getMonth() 方法获取月份,使用 getDate() 方法获取日子等信息。
const today = new Date();
const dayOfWeek = today.getDay(); // 周日为 0,周一为 1,以此类推
const monthOfYear = today.getMonth(); // 0 表示一月,1 表示二月,以此类推
const dayOfMonth = today.getDate(); // 1 表示第一天,2 表示第二天,以此类推
一般来说,当前的周数指的是当前是这一年中的第几周。在 JavaScript 中,我们可以使用一些算法来计算当前周数。
首先,我们可以将每年的第一周起始时间定义为第一周的起始时间。在这种情况下,我们可以使用以下算法来计算当前周数:
通过 getFullYear() 方法获取当前年份;
找到当前年份的第一周的起始时间(即第一周的周一),可以使用以下代码实现:
const firstDayOfYear = new Date(today.getFullYear(), 0, 1); // 获取当年的第一天
const firstDayOfWeek = firstDayOfYear.getDay() === 0 ? 7 : firstDayOfYear.getDay(); // 获取第一天是周几
const daysToFirstMonday = firstDayOfWeek <= 4 ? 1 - firstDayOfWeek : 8 - firstDayOfWeek; // 计算到第一个周一的天数
const firstMonday = new Date(today.getFullYear(), 0, 1 + daysToFirstMonday); // 获取第一周的起始日期
计算当前日期和第一周起始日期之间的天数差,以确定当前日期是该年的第几天;
将当前日期加上与第一周起始日期之间的天数差,得到当前周的起始日期;
计算当前周的年份和月份;
计算当前周是该年的第几周。
代码实现如下:
const year = today.getFullYear(); // 获取当前年份
const firstDayOfYear = new Date(year, 0, 1); // 获取当年的第一天
const firstDayOfWeek = firstDayOfYear.getDay() === 0 ? 7 : firstDayOfYear.getDay(); // 获取第一天是周几
const daysToFirstMonday = firstDayOfWeek <= 4 ? 1 - firstDayOfWeek : 8 - firstDayOfWeek; // 计算到第一个周一的天数
const firstMonday = new Date(year, 0, 1 + daysToFirstMonday); // 获取第一周的起始日期
const dayOfYear = Math.ceil((today - firstDayOfYear) / (24 * 60 * 60 * 1000)); // 当前日期是该年的第几天
const currentWeekStart = new Date(year, 0, dayOfYear + daysToFirstMonday); // 当前周的起始日期
const currentYear = currentWeekStart.getFullYear(); // 当前周所在的年份
const currentMonth = currentWeekStart.getMonth() + 1; // 当前周所在的月份
const weekOfYear = Math.ceil(dayOfYear / 7); // 当前周是该年的第几周
console.log(`当前是 ${currentYear} 年的第 ${weekOfYear} 周(${currentMonth} 月)。`);
ISO 8601 标准规定每周的起始时间为周一,一年中的第一周是包含该年第一个星期四的周。在这种情况下,我们可以使用以下算法来计算当前周数:
代码实现如下:
const year = today.getFullYear(); // 获取当前年份
const thursdayOffset = 4 - (new Date(year, 0, 1).getDay() || 7); // 第一年的第一个星期四
const firstThursdayOfYear = new Date(year, 0, 1 + thursdayOffset); // 第一个星期四
const daysToToday = (today - firstThursdayOfYear) / 86400000 + 3; // 计算当前日期与第一个星期四的天数差
const weekOfYear = Math.floor(daysToToday / 7) + 1; // 当前是该年的第几周
console.log(`当前是 ${year} 年的第 ${weekOfYear} 周。`);
以下是包含方法一和方法二的完整示例代码:
const today = new Date();
// 方法一
const year = today.getFullYear(); // 获取当前年份
const firstDayOfYear = new Date(year, 0, 1); // 获取当年的第一天
const firstDayOfWeek = firstDayOfYear.getDay() === 0 ? 7 : firstDayOfYear.getDay(); // 获取第一天是周几
const daysToFirstMonday = firstDayOfWeek <= 4 ? 1 - firstDayOfWeek : 8 - firstDayOfWeek; // 计算到第一个周一的天数
const firstMonday = new Date(year, 0, 1 + daysToFirstMonday); // 获取第一周的起始日期
const dayOfYear = Math.ceil((today - firstDayOfYear) / (24 * 60 * 60 * 1000)); // 当前日期是该年的第几天
const currentWeekStart = new Date(year, 0, dayOfYear + daysToFirstMonday); // 当前周的起始日期
const currentYear = currentWeekStart.getFullYear(); // 当前周所在的年份
const currentMonth = currentWeekStart.getMonth() + 1; // 当前周所在的月份
const weekOfYear = Math.ceil(dayOfYear / 7); // 当前周是该年的第几周
console.log(`方法一:当前是 ${currentYear} 年的第 ${weekOfYear} 周(${currentMonth} 月)。`);
// 方法二
const thursdayOffset = 4 - (new Date(year, 0, 1).getDay() || 7); // 第一年的第一个星期四
const firstThursdayOfYear = new Date(year, 0, 1 + thursdayOffset); // 第一个星期四
const daysToToday = (today - firstThursdayOfYear) / 86400000 + 3; // 计算当前日期与第一个星期四的天数差
const weekOfYear2 = Math.floor(daysToToday / 7) + 1; // 当前是该年的第几周
console.log(`方法二:当前是 ${year} 年的第 ${weekOfYear2} 周。`);