📜  在 JavaScript 中计算当前周数(1)

📅  最后修改于: 2023-12-03 15:37:22.106000             🧑  作者: Mango

在 JavaScript 中计算当前周数

在许多应用程序和网站中,需要根据当前日期计算当前的周数,以便在周报、日历等方面进行使用。在 JavaScript 中,我们可以使用一些方法来计算当前的周数。

Date 对象

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 中,我们可以使用一些算法来计算当前周数。

方法一:使用第一周的周一作为第一周起始时间

首先,我们可以将每年的第一周起始时间定义为第一周的起始时间。在这种情况下,我们可以使用以下算法来计算当前周数:

  1. 通过 getFullYear() 方法获取当前年份;

  2. 找到当前年份的第一周的起始时间(即第一周的周一),可以使用以下代码实现:

    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); // 获取第一周的起始日期
    
  3. 计算当前日期和第一周起始日期之间的天数差,以确定当前日期是该年的第几天;

  4. 将当前日期加上与第一周起始日期之间的天数差,得到当前周的起始日期;

  5. 计算当前周的年份和月份;

  6. 计算当前周是该年的第几周。

代码实现如下:

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 标准计算周数

ISO 8601 标准规定每周的起始时间为周一,一年中的第一周是包含该年第一个星期四的周。在这种情况下,我们可以使用以下算法来计算当前周数:

  1. 通过 getFullYear() 方法获取当前年份;
  2. 计算当前日期和该年的第一个星期四(如果今天是星期四或之后则为今年第一个星期四,否则为去年最后一个星期四)的天数差,并将结果加上 3;
  3. 将结果除以 7,并向下取整;
  4. 将结果加 1,计算当前周为该年的第几周。

代码实现如下:

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} 周。`);