JavaScript 实现日期计算:本月周数、日数及年度周天统计

作者:代码拾荒时间:2026-10-23 05:04:27浏览:631

本文提供了一套JavaScript代码,用于扩展String原型以处理日期计算。主要功能包括判断指定日期属于本月第几周、本月总周数、本月天数,以及该日期属于今年的第几周和第几天。代码包含详细的调用示例和返回值说明,并附带了关于周定义规则的说明及版本更新记录,适用于需要精确日期逻辑的前端开发场景。

问题背景与更新记录

近期工作中遇到一个具有代表性的技术问题,网络上未能直接找到现成的解决方案。因此,我结合个人编写的代码与参考他人的思路,整理出以下实现方案,旨在解决这一具体需求。

2018-6-20 更新:增加了判断当天是否为周日的逻辑。

2018-7-31 更新:为String类型添加了相应的方法以便直接调用,感谢Rainbow_miao的提示。相关代码已开源至:https://github.com/zancheng/weekCalculation

以下是具体的JavaScript实现源码。

周数判定规则如下:

第一周的界定标准为:该周属于当前月份的新周,且不包含在上个月最后一周的范围内。

核心算法与判定规则


// 获取某年某月的有多少周
String.prototype.weekInMonthCount = function () {
  var date = new Date((new Date(this).setDate(1)) || (new Date()).setDate(1));
  var firstWeekDate = 1;// 默认第一周是本月1号 为了模拟本月1号是否为本月第1周的判断
  if (date.getDay() === 1) { // 判断1号是周一
    firstWeekDatek = 1;
  } else if (date.getDay() === 0) { // 判断1号是周日
    firstWeekDate = 8 - 7 + 1;
  } else { // 判断1号是周二至周六之间
    firstWeekDate = 8 - date.getDay() + 1;
  }
  date.setMonth(date.getMonth()+1);
  date.setDate(0);
  var monthHasDays = date.getDate();// 本月天数
  monthHasDays = date.getDate() - firstWeekDate + 1;
  var hasWeek = Math.ceil(monthHasDays/7); // 计算本月有几周
  return hasWeek;
};
// 获取今天是今年的第几周
String.prototype.weekIndexInYear = function () {
  var nowDate = new Date(this != '' ? this : new Date());
  var initTime = new Date(this != '' ? this : new Date());
  initTime.setMonth(0); // 本年初始月份
  initTime.setDate(1); // 本年初始时间
  var differenceVal = nowDate - initTime ; // 今天的时间减去本年开始时间,获得相差的时间
  var todayYear = Math.ceil(differenceVal/(24*60*60*1000)); // 获取今天是今年第几天
  var index = Math.ceil(todayYear/7); // 获取今天是今年第几周
  return index;
};
// 获取今天是今年的第几天
String.prototype.dateIndexInYear = function () {
  var nowDate = new Date(this != '' ? this : new Date());
  var initTime = new Date(this != '' ? this : new Date());
  initTime.setMonth(0); // 本年初始月份
  initTime.setDate(1); // 本年初始时间
  var differenceVal = nowDate - initTime ; // 今天的时间减去本年开始时间,获得相差的时间
  return Math.ceil(differenceVal/(24*60*60*1000));
};
// 获取今天是第几周
String.prototype.weekIndexInMonth = function () {
  var date = new Date(this.trim() != '' ? this : new Date());
  var dateStart = new Date((new Date(this.trim() != '' ? this : new Date()).setDate(1))); // 本月初
  var firstWeek = 1;
  if (dateStart.getDay() === 1) {
    firstWeek = 1;
  } else if (dateStart.getDay() === 0) {
    firstWeek = 8 - 7 + 1;
  } else {
    firstWeek = 8 - dateStart.getDay() + 1;
  }
  var weekIndex = 1;
  var c = date.getDate();
  if (date.getDay() === 1 && date.getDate() < 7) {
    weekIndex = 1;
  } else if (c < firstWeek ) {
    weekIndex = -1;
  } else {
    if (c < 7) {
      weekIndex = Math.ceil(c/7);
    } else {
      c = c - firstWeek + 1;
      if (c%7 === 0) {
        if (dateStart.getDay() !== 6) {
          weekIndex = c/7;
        } else {
          weekIndex = c/7 + 1;
        }
      } else {
        weekIndex = Math.ceil(c/7);
      }
    }
  }
  return weekIndex;
};

方法说明与调用示例

以下是各方法的具体说明及调用示例。

String.prototype.dateIndexInYear

用于计算指定日期在当年中是第几天。

若未指定时间,默认使用当前日期。调用示例如下:

'2018/10/1'.dateIndexInYear() 返回: 273

String.prototype.weekIndexInYear

用于计算指定日期在当年中属于第几周。

若未指定时间,默认使用当前日期。调用示例如下:

'2018-10-1'.weekIndexInYear() 返回: 39

String.prototype.weekInMonthCount

用于计算指定年份的指定月份总共包含多少周。

若未指定时间,默认使用当前日期。调用示例如下:

'2018-10-1'.weekInMonthCount()

返回: 5

String.prototype.weekIndexInMonth

用于计算指定日期属于当前月份的第几周。

若该日期实际上属于上一个月,则返回 -1。

若未指定时间,默认使用当前日期。调用示例如下:

'2018-10-01'.weekIndexInMonth() 返回: 1

总结

总结

上述内容介绍了利用JavaScript获取本月第几周、本月总周数、本月天数,以及今年第几周和第几天的完整实现。希望这些代码能对各位开发者有所帮助。如有任何疑问,欢迎留言交流,我会及时回复。感谢大家的支持!

作者最新文章