Wie kann ich die Wochennummer des Monats mit Javascript/Jquery ermitteln?
ZB:
Erste Woche: 5. Juli 2010./Wochennummer = Erster Montag
Vorherige Woche: 12. Juli 2010./Wochennummer = Zweiter Montag
Aktuelles Datum: 19. Juli 2010./Wochennummer = Dritter Montag
Nächste Woche: 26. Juli 2010./Wochennummer = Letzter Montag
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()) );
Das Hinzufügen der Möglichkeit, Last ...
zu haben, kann mehr Hacken erfordern ...
Dies ist eine alte Frage, aber die Antworten sind einfach falsch. Dies ist meine browserübergreifende Lösung:
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]);
});
Sie müssen es nicht direkt auf den Prototyp setzen, wenn Sie nicht möchten. In meiner Implementierung bedeutet 6 "Letzter", nicht "Sechster". Wenn Sie möchten, dass immer die tatsächliche Woche des Monats zurückgegeben wird, übergeben Sie einfach true
.
EDIT: Dieser Fehler wurde behoben, um 5 & 6-Wochen-Monate zu behandeln. Meine "Unit-Tests" können Sie gerne abspalten: http://jsfiddle.net/OlsonDev/5mXF6/1/ .
week_number = 0 | new Date().getDate() / 7
Auch mit diesem Thema zu kämpfen - danke an Olson.dev! Ich habe seine Funktion etwas verkürzt, wenn jemand interessiert ist:
// 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);
}
Dies ist einige Jahre später, aber ich musste diese Funktionalität in letzter Zeit verwenden, und für bestimmte Daten in den Jahren 2016/2020 (z. B. der 31. Januar) ist der Code hier nicht verfügbar.
Es ist auf keinen Fall das effizienteste, aber hoffentlich hilft es jemandem, da es das einzige ist, was ich für diese Jahre zusammen mit jedem zweiten Jahr arbeiten könnte.
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;
}
}
};
Ich denke das funktioniert. Es gibt die Woche des Monats zurück, beginnend bei 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(`enter code here`(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;
}
Ich hoffe das funktioniert. Bis 2025 getestet
Ich konnte gerade einen einfacheren Code finden, um die Anzahl der Wochen für einen bestimmten Monat eines Jahres zu berechnen.
y == Jahr zum Beispiel {2012} m == ist ein Wert von {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 );
}
Nachdem ich alle Antworten gelesen hatte, fand ich einen Weg, der weniger CPU verbraucht als die anderen und jeden Tag eines jeden Monats eines jeden Jahres arbeitet. Hier ist mein Code:
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
}
Ich hoffe das kann helfen.
Ich denke, Sie möchten weekOfMonth
verwenden, damit es 1-4 oder 1-5 Wochen des Monats gibt. Ich habe das gleiche Problem damit gelöst:
var dated = new Date();
var weekOfMonth = (0 | dated.getDate() / 7)+1;
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;
}
Anscheinend ist die erste Woche des Jahres die Woche, die den ersten Donnerstag des Jahres enthält.
Ohne den UTCDay zu berechnen, war die zurückgegebene Woche eine Woche vor dem, was sie hätte sein sollen. Nicht zuversichtlich, dass dies nicht verbessert werden kann, scheint aber vorerst zu funktionieren.
Bitte versuchen Sie es unterhalb der Funktion. Dieses Datum berücksichtigt das Startdatum der Woche als Montag und das Enddatum der Woche als Sonntag.
getWeekNumber(date) {
var monthStartDate =new Date(new Date().getFullYear(), new
Date().getMonth(), 1);
monthStartDate = new Date(monthStartDate);
var day = startdate.getDay();
date = new Date(date);
var date = date.getDate();
return Math.ceil((date+ day-1)/ 7);
}
Dies wird nicht nativ unterstützt.
Sie können Ihre eigene Funktion dafür rollen, indem Sie vom ersten Tag des Monats aus arbeiten
var currentDate = new Date();
var firstDayOfMonth = new Date( currentDate.getFullYear(), currentDate.getMonth(), 1 );
Und dann den Wochentag dieses Datums bekommen:
var firstWeekday = firstDayOfMonth.getDay();
..., der Ihnen einen auf Null basierenden Index von 0-6 gibt, wobei 0 der Sonntag ist.
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;
}