获得一个月的一周

时间:2010-07-19 10:43:50

标签: javascript jquery date

如何使用javascript / jquery获取周数?

例如:

第一周:2010年7月5日。/周数= 第一周一

上周:2010年7月12日。/周数= 第二个星期一

当前日期:2010年7月19日。/周数= 第三个星期一

下周:2010年7月26日。/周数= 上周一

15 个答案:

答案 0 :(得分:29)

这是一个老问题,但存在的答案是完全错误的。这是我的跨浏览器兼容解决方案:

    Date.prototype.getWeekOfMonth = function(exact) {
        var month = this.getMonth()
            , year = this.getFullYear()
            , firstWeekday = new Date(year, month, 1).getDay()
            , lastDateOfMonth = new Date(year, month + 1, 0).getDate()
            , offsetDate = this.getDate() + firstWeekday - 1
            , index = 1 // start index at 0 or 1, your choice
            , weeksInMonth = index + Math.ceil((lastDateOfMonth + firstWeekday - 7) / 7)
            , week = index + Math.floor(offsetDate / 7)
        ;
        if (exact || week < 2 + index) return week;
        return week === weeksInMonth ? index + 5 : week;
    };
    
    // Simple helper to parse YYYY-MM-DD as local
    function parseISOAsLocal(s){
      var b = s.split(/\D/);
      return new Date(b[0],b[1]-1,b[2]);
    }

    // Tests
    console.log('Date          Exact|expected   not exact|expected');
    [   ['2013-02-01', 1, 1],['2013-02-05', 2, 2],['2013-02-14', 3, 3],
        ['2013-02-23', 4, 4],['2013-02-24', 5, 6],['2013-02-28', 5, 6],
        ['2013-03-01', 1, 1],['2013-03-02', 1, 1],['2013-03-03', 2, 2],
        ['2013-03-15', 3, 3],['2013-03-17', 4, 4],['2013-03-23', 4, 4],
        ['2013-03-24', 5, 5],['2013-03-30', 5, 5],['2013-03-31', 6, 6]
    ].forEach(function(test){
      var d = parseISOAsLocal(test[0])
      console.log(test[0] + '        ' + 
      d.getWeekOfMonth(true) + '|' + test[1] + '                  ' +
      d.getWeekOfMonth() + '|' + test[2]); 
    });

如果您不想,则无需将其直接放在原型上。在我的实现中,6表示“最后”,而不是“第六”。如果您希望它始终返回当月的实际周,只需通过true

编辑:修正了此问题以处理5&amp;为期6周的月份。我的“单元测试”,随意分叉:http://jsfiddle.net/OlsonDev/5mXF6/1/

答案 1 :(得分:4)

也正在与这个话题斗争 - 感谢Olson.dev!如果有人有兴趣的话,我已经缩短了他的功能:

// returns week of the month starting with 0
Date.prototype.getWeekOfMonth = function() {
  var firstWeekday = new Date(this.getFullYear(), this.getMonth(), 1).getDay();
  var offsetDate = this.getDate() + firstWeekday - 1;
  return Math.floor(offsetDate / 7);
}

答案 2 :(得分:3)

week_number = 0 | new Date().getDate() / 7

答案 3 :(得分:3)

这是几年了,但我最近需要使用此功能,对于2016/2020年的某些日期(例如1月31日),此处的代码都不起作用。

它无论如何都不是最有效率的,但希望这可以帮助别人,因为这是我在这些年里和其他每一年一起工作的唯一方法。

Date.prototype.getWeekOfMonth = function () {
    var dayOfMonth = this.getDay();
    var month = this.getMonth();
    var year = this.getFullYear();
    var checkDate = new Date(year, month, this.getDate());
    var checkDateTime = checkDate.getTime();
    var currentWeek = 0;

    for (var i = 1; i < 32; i++) {
        var loopDate = new Date(year, month, i);

        if (loopDate.getDay() == dayOfMonth) {
            currentWeek++;
        }

        if (loopDate.getTime() == checkDateTime) {
            return currentWeek;
        }
    }
};

答案 4 :(得分:2)

我认为这很有效。它返回月份的周,从0开始:

var d = new Date();
var date = d.getDate();
var day = d.getDay();

var weekOfMonth = Math.ceil((date - 1 - day) / 7);

答案 5 :(得分:1)

以前的解决方案都没有在响应中包含“最后一个”,我能够通过检查一周中同一天的下一次出现并检查它是否仍在本月来做到这一点。

接受的答案在很多情况下都失败了(我用今天的日期 - 2021-05-14 对其进行了测试 - 它返回“第三个星期五”,而实际上是第二个星期五)。

即使在 2017 年 4 月(罕见的情况下,一个月有 6 周),以下代码也经过了测试。

April 2017 - month with 6 weeks

/**
 * Get the week number of the month, from "First" to "Last"
 * @param {Date} date 
 * @returns {string}
 */
 function weekOfTheMonth(date) {
  const day = date.getDate()
  const weekDay = date.getDay()
  let week = Math.ceil(day / 7)
  
  const ordinal = ['First', 'Second', 'Third', 'Fourth', 'Last']
  const weekDays  = ['Sunday','Monday','Tuesday','Wednesday', 'Thursday','Friday','Saturday']
  

  // Check the next day of the week and if it' on the same month, if not, respond with "Last"
  const nextWeekDay = new Date(date.getTime() + (1000 * 60 * 60 * 24 * 7))
  if (nextWeekDay.getMonth() !== date.getMonth()) {
    week = 5
  }
  
  return `${ordinal[week - 1]} ${weekDays[weekDay]}`
}

const days = [
  new Date('2021-05-14'),
  new Date('26 July 2010'),
  new Date('5 July 2010'),
  new Date('12 July 2010'),
  new Date('22 April 2017'),
  new Date('29 April 2017'),
]

for (let i = 0; i < days.length; i += 1) {
  const d = days[i]
  console.log(d, weekOfTheMonth(d))
}

答案 6 :(得分:0)

这本身就不支持。

您可以为此启用自己的功能,从该月的第一天开始

var currentDate = new Date();
var firstDayOfMonth = new Date( currentDate.getFullYear(), currentDate.getMonth(), 1 );

然后获得该日期的工作日:

var firstWeekday = firstDayOfMonth.getDay();

...这将给你一个从零开始的索引,从0到6,其中0是星期日。

答案 7 :(得分:0)

function weekAndDay(date) {
    
    var days = ['Sunday','Monday','Tuesday','Wednesday',
                'Thursday','Friday','Saturday'],
        prefixes = ['First', 'Second', 'Third', 'Fourth', 'Fifth'];

    return prefixes[Math.floor(date.getDate() / 7)] + ' ' + days[date.getDay()];

}

console.log( weekAndDay(new Date(2010,7-1, 5)) ); // => "First Monday"
console.log( weekAndDay(new Date(2010,7-1,12)) ); // => "Second Monday"
console.log( weekAndDay(new Date(2010,7-1,19)) ); // => "Third Monday"
console.log( weekAndDay(new Date(2010,7-1,26)) ); // => "Fourth Monday"
console.log( weekAndDay(new Date()) );

添加Last ...的功能可能需要更多的黑客攻击......

答案 8 :(得分:0)

我只能找出一个更简单的代码来计算一年中某个月的周数。

y ==年份例如{2012} m ==是{0 - 11}

的值
function weeks_Of_Month( y, m ) {
    var first = new Date(y, m,1).getDay();      
    var last = 32 - new Date(y, m, 32).getDate(); 

    // logic to calculate number of weeks for the current month
    return Math.ceil( (first + last)/7 );   
}

答案 9 :(得分:0)

function weekNumberForDate(date){

    var janOne = new Date(date.getFullYear(),0,1);
    var _date = new Date(date.getFullYear(),date.getMonth(),date.getDate());
    var yearDay = ((_date - janOne + 1) / 86400000);//60 * 60 * 24 * 1000
    var day = janOne.getUTCDay();
    if (day<4){yearDay+=day;}
    var week = Math.ceil(yearDay/7);

   return week;
}

显然,一年中的第一周是包含该年第一个星期四的那一周。

在不计算UTCDay的情况下,返回的一周比本来应该的那样一周。不相信这无法改进,但现在似乎有效。

答案 10 :(得分:0)

我认为你想使用weekOfMonth所以它会给出1-4或1-5周的月份。我解决了同样的问题:

var dated = new Date();
var weekOfMonth = (0 | dated.getDate() / 7)+1;

答案 11 :(得分:0)

function getWeekOfMonth(date) {

  var nth = 0; // returning variable.
  var timestamp = date.getTime(); // get UTC timestamp of date.
  var month = date.getMonth(); // get current month.
  var m = month; // save temp value of month.

  while( m == month ) {  // check if m equals our date's month.
    nth++; // increment our week count.
    // update m to reflect previous week (previous to last value of m).
    m = new Date(timestamp - nth * 604800000).getMonth();
  }

  return nth;

}

答案 12 :(得分:0)

在阅读完所有答案之后,我发现了一种比其他人使用更少CPU并且每年每个月的每一天工作的方法。这是我的代码:

function getWeekInMonth(year, month, day){

    let weekNum = 1; // we start at week 1

    let weekDay = new Date(year, month - 1, 1).getDay(); // we get the weekDay of day 1
    weekDay = weekDay === 0 ? 6 : weekDay-1; // we recalculate the weekDay (Mon:0, Tue:1, Wed:2, Thu:3, Fri:4, Sat:5, Sun:6)

    let monday = 1+(7-weekDay); // we get the first monday of the month

    while(monday <= day) { //we calculate in wich week is our day
        weekNum++;
        monday += 7;
    }

    return weekNum; //we return it
}

我希望这可以提供帮助。

答案 13 :(得分:0)

function getWeekOfMonth(date) {
  const startWeekDayIndex = 1; // 1 MonthDay 0 Sundays
  const firstDate = new Date(date.getFullYear(), date.getMonth(), 1);
  const firstDay = firstDate.getDay();

  let weekNumber = Math.ceil((date.getDate() + firstDay) / 7);
  if (startWeekDayIndex === 1) {
    if (date.getDay() === 0 && date.getDate() > 1) {
      weekNumber -= 1;
    }

    if (firstDate.getDate() === 1 && firstDay === 0 && date.getDate() > 1) {
      weekNumber += 1;
    }
  }
  return weekNumber;
}

我希望这有效 测试到2025年

答案 14 :(得分:0)

import getWeekOfMonth from 'date-fns/getWeekOfMonth'
...
let weekOfMonth = getWeekOfMonth(new Date())

https://date-fns.org/v2.0.0-alpha.9/docs/getWeekOfMonth