如何使用 javascript/jquery 获取月份的周数?
例如:
第一周:2010 年 7 月 5 日。/周数 =第一个星期一
前一周:2010 年 7 月 12 日。/周数 =第二个星期一
当前日期:2010 年 7 月 19 日。/周数 =第三个星期一
下周:2010 年 7 月 26 日。/周数 =上周一
如何使用 javascript/jquery 获取月份的周数?
例如:
第一周:2010 年 7 月 5 日。/周数 =第一个星期一
前一周:2010 年 7 月 12 日。/周数 =第二个星期一
当前日期:2010 年 7 月 19 日。/周数 =第三个星期一
下周:2010 年 7 月 26 日。/周数 =上周一
这是一个古老的问题,但现有的答案完全是错误的。这是我的跨浏览器兼容解决方案:
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 和 6 周的月份。我的“单元测试”,请随意分叉:http : //jsfiddle.net/OlsonDev/5mXF6/1/。
在这个话题上也有挣扎 - 感谢 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);
}
更新:如果您需要本地化版本 - 您必须调整 firstWeekday 变量
// german version - week starts with monday
Date.prototype.getWeekOfMonth = function() {
var firstWeekday = new Date(this.getFullYear(), this.getMonth(), 1).getDay() - 1;
if (firstWeekday < 0) firstWeekday = 6;
var offsetDate = this.getDate() + firstWeekday - 1;
return Math.floor(offsetDate / 7);
}
我认为这有效。它返回一个月中的第几周,从 0 开始:
var d = new Date();
var date = d.getDate();
var day = d.getDay();
var weekOfMonth = Math.ceil((date - 1 - day) / 7);
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 年
这是几年过去了,但我最近需要使用此功能,并且在 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;
}
}
};