Holen Sie sich die Woche des Jahres in JavaScript wie in PHP

140

Wie erhalte ich die aktuelle Wochennummer des Jahres wie PHPs date('W')?

Es sollte die ISO-8601-Wochenzahl des Jahres sein, Wochen ab Montag.

PeeHaa
quelle
1
Schauen Sie sich <a href=" javascript.about.com/library/blweekyear.htm "> <b> hier </ b> </a> an. Dies war der erste Link, der angegeben wurde, als ich "Javascript-Woche des Jahres" googelte.
Pete Wilson
+1 Lol! Dort habe ich das Snippet von mir selbst bekommen, aber ich konnte mich nicht an die Quelle erinnern, wie ich es vor einiger Zeit bekommen habe.
Tom Chantler
@Pete: Dieser Code erhält 22 als aktuelle Woche. Während es 21 sein sollte
PeeHaa
@Pete :: D Nopez ein einfaches -1 reicht nicht aus: P Das würde die ISO-8601-Wochennummer nicht bekommen. Eine Woche in ISO-8601 beginnt am Montag. Die erste Woche ist die Woche mit dem ersten Donnerstag des Jahres. en.wikipedia.org/wiki/ISO-8601 . PS: Ich war es nicht, der dich herabgestimmt hat.
PeeHaa

Antworten:

276

Sie sollten in der Lage sein, hier zu bekommen, was Sie wollen: http://www.merlyn.demon.co.uk/js-date6.htm#YWD .

Ein besserer Link auf derselben Site ist: Arbeiten mit Wochen .

Bearbeiten

Hier ist ein Code, der auf den bereitgestellten Links und dem von Dommer geposteten Eariler basiert. Es wurde leicht gegen Ergebnisse unter http://www.merlyn.demon.co.uk/js-date6.htm#YWD getestet . Bitte gründlich testen, keine Garantie gegeben.

2017 bearbeiten

Es gab ein Problem mit Daten während des Zeitraums, in dem die Sommerzeit beobachtet wurde, und Jahren, in denen der 1. Januar Freitag war. Mit allen UTC-Methoden behoben. Im Folgenden werden identische Ergebnisse für Moment.js zurückgegeben.

/* For a given date, get the ISO week number
 *
 * Based on information at:
 *
 *    http://www.merlyn.demon.co.uk/weekcalc.htm#WNR
 *
 * Algorithm is to find nearest thursday, it's year
 * is the year of the week number. Then get weeks
 * between that date and the first day of that year.
 *
 * Note that dates in one year can be weeks of previous
 * or next year, overlap is up to 3 days.
 *
 * e.g. 2014/12/29 is Monday in week  1 of 2015
 *      2012/1/1   is Sunday in week 52 of 2011
 */
function getWeekNumber(d) {
    // Copy date so don't modify original
    d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));
    // Set to nearest Thursday: current date + 4 - current day number
    // Make Sunday's day number 7
    d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay()||7));
    // Get first day of year
    var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
    // Calculate full weeks to nearest Thursday
    var weekNo = Math.ceil(( ( (d - yearStart) / 86400000) + 1)/7);
    // Return array of year and week number
    return [d.getUTCFullYear(), weekNo];
}

var result = getWeekNumber(new Date());
document.write('It\'s currently week ' + result[1] + ' of ' + result[0]);

Stunden werden beim Erstellen des "UTC" -Datums auf Null gesetzt.

Minimierte Prototypversion (gibt nur die Wochennummer zurück):

Date.prototype.getWeekNumber = function(){
  var d = new Date(Date.UTC(this.getFullYear(), this.getMonth(), this.getDate()));
  var dayNum = d.getUTCDay() || 7;
  d.setUTCDate(d.getUTCDate() + 4 - dayNum);
  var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
  return Math.ceil((((d - yearStart) / 86400000) + 1)/7)
};

document.write('The current ISO week number is ' + new Date().getWeekNumber());

Testabschnitt

In diesem Abschnitt können Sie ein beliebiges Datum im Format JJJJ-MM-TT eingeben und überprüfen, ob dieser Code dieselbe Wochennummer wie die ISO-Wochennummer von Moment.j enthält (getestet über 50 Jahre von 2000 bis 2050).

Date.prototype.getWeekNumber = function(){
  var d = new Date(Date.UTC(this.getFullYear(), this.getMonth(), this.getDate()));
  var dayNum = d.getUTCDay() || 7;
  d.setUTCDate(d.getUTCDate() + 4 - dayNum);
  var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
  return Math.ceil((((d - yearStart) / 86400000) + 1)/7)
};

function checkWeek() {
  var s = document.getElementById('dString').value;
  var m = moment(s, 'YYYY-MM-DD');
  document.getElementById('momentWeek').value = m.format('W');
  document.getElementById('answerWeek').value = m.toDate().getWeekNumber();      
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

Enter date  YYYY-MM-DD: <input id="dString" value="2021-02-22">
<button onclick="checkWeek(this)">Check week number</button><br>
Moment: <input id="momentWeek" readonly><br>
Answer: <input id="answerWeek" readonly>

RobG
quelle
8
Dieser Code berechnet den 2. Januar 2011 als 53. Woche des Jahres 2010, wo er der 52. sein sollte. Dies funktioniert im Originalcode korrekt, jedoch nicht in Ihrer Anpassung.
Alasdair
4
Du hast meinen Arsch gerettet. Vielen Dank. Wenn Sie zu Open Source beitragen möchten, empfehlen wir Ihnen, einen Patch für die jQuery-UI-Methode zu erstellen: $ .datepicker.iso8601Week (Datum), da nur weekNo, aber kein Jahr zurückgegeben wird.
Christian
18
Heute, am 4. Januar 2016, bemerkte ich, dass es ebenfalls notwendig war, etwas hinzuzufügen d.setMilliseconds(0)- es wurden immer wieder unterschiedliche Wochennummern für dasselbe Datum angezeigt, je nachdem, ob ich ein neues Datum () oder ein neues Datum ("04.01.2016") verwendet habe. Nur ein Kopf hoch für andere, die das Gleiche erleben könnten.
Jacob Lauritzen
2
Vorausgesetzt, der Code folgt nicht ISO 8601, er ist um eins
Eric Grange
2
Hoppla, Sie haben Recht, mein Tippfehler sollte "30.12.2015" sein, was funktioniert.
Verbündeter
38

Sie können die momentjs-Bibliothek auch verwenden:

moment().format('W')

6 Tage
quelle
9
odermoment().week()
Alex78191
25

Wie oben gesagt, aber ohne Klasse:

let now = new Date();
let onejan = new Date(now.getFullYear(), 0, 1);
week = Math.ceil( (((now - onejan) / 86400000) + onejan.getDay() + 1) / 7 );
nvd
quelle
4
One-Jan-Tang! * Ninja-Roll *
CodeManX
2
Dies ist die einzige Antwort, die selbst für die erste Woche eines Jahres die richtige Wochennummer abruft.
PrasadW
Beachten Sie dies (now.getTime() - onejan.getTime()), um Build-Probleme zu vermeiden.
Swoox
3
Die Frage nach ISO 8601 wird ignoriert. Als Antwort auf die Frage ist es einfach falsch
Havlock
23

Entsprechend http://javascript.about.com/library/blweekyear.htm

Date.prototype.getWeek = function() {
    var onejan = new Date(this.getFullYear(),0,1);
    var millisecsInDay = 86400000;
    return Math.ceil((((this - onejan) /millisecsInDay) + onejan.getDay()+1)/7);
};
orafaelreis
quelle
1
Prägnant, behandelt aber den Sonntag als den ersten Tag der Woche, sodass der Sonntag, der 27. Dezember 2015, eher der erste Tag der Woche 53 als der letzte Tag der Woche 52 ist.
RobG
3
Ich denke, da dies dem Prototyp hinzugefügt wird, ist es das, was Sie erwarten würden, da Date den Sonntag als ersten Tag behandelt.
Ed Sykes
Wird dies an Sommertagen keine Probleme haben? Ich denke, es wird im Sommer erst um 1 Uhr morgens weitergehen.
Hafthor
Auch wird die Woche technisch nicht vor 0: 00: 00.001 Uhr vorgezogen? Besser Math.floor verwenden?
Hafthor
11

Die Date.format()Bibliothek von Jacob Wright implementiert die Datumsformatierung im Stil der PHP- date()Funktion und unterstützt die Wochennummer ISO-8601:

new Date().format('W');

Es mag für nur eine Woche etwas übertrieben sein, aber es unterstützt die Formatierung im PHP-Stil und ist sehr praktisch, wenn Sie viel davon tun.

Brad Koch
quelle
Gute Lösung für schnell zusammengehackte Skripte :)
Steen Schütt
6
getWeekOfYear: function(date) {
        var target = new Date(date.valueOf()),
            dayNumber = (date.getUTCDay() + 6) % 7,
            firstThursday;

        target.setUTCDate(target.getUTCDate() - dayNumber + 3);
        firstThursday = target.valueOf();
        target.setUTCMonth(0, 1);

        if (target.getUTCDay() !== 4) {
            target.setUTCMonth(0, 1 + ((4 - target.getUTCDay()) + 7) % 7);
        }

        return Math.ceil((firstThursday - target) /  (7 * 24 * 3600 * 1000)) + 1;
    }

Der folgende Code ist zeitzonenunabhängig (UTC-Daten verwendet) und funktioniert gemäß https://en.wikipedia.org/wiki/ISO_8601

Dmitry Volokh
quelle
4

Ich fand die SimpleDateFormat- Klasse von Java SE nützlich, die in der Oracle-Spezifikation beschrieben ist: http://goo.gl/7MbCh5 . In meinem Fall in Google Apps Script hat es folgendermaßen funktioniert:

function getWeekNumber() {
  var weekNum = parseInt(Utilities.formatDate(new Date(), "GMT", "w"));
  Logger.log(weekNum);
}

In einem Tabellenkalkulationsmakro können Sie beispielsweise die tatsächliche Zeitzone der Datei abrufen:

function getWeekNumber() {
  var weekNum = parseInt(Utilities.formatDate(new Date(), SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(), "w"));
  Logger.log(weekNum);
}
Balu Ertl
quelle
4

Dadurch wird Date.prototype um die Methode "getWeek" erweitert, die die Anzahl der Wochen ab Jahresbeginn zurückgibt. Das Argument definiert, welcher Wochentag den ersten berücksichtigt. Wenn kein Argument vorliegt, wird der erste Tag als Sonntag angenommen.

/**
 * Get week number in the year.
 * @param  {Integer} [weekStart=0]  First day of the week. 0-based. 0 for Sunday, 6 for Saturday.
 * @return {Integer}                0-based number of week.
 */
Date.prototype.getWeek = function(weekStart) {
    var januaryFirst = new Date(this.getFullYear(), 0, 1);
    if(weekStart !== undefined && (typeof weekStart !== 'number' || weekStart % 1 !== 0 || weekStart < 0 || weekStart > 6)) {
      throw new Error('Wrong argument. Must be an integer between 0 and 6.');
    }
    weekStart = weekStart || 0;
    return Math.floor((((this - januaryFirst) / 86400000) + januaryFirst.getDay() - weekStart) / 7);
};
Tigran
quelle
1
Die erste Kalenderwoche 2016 beginnt am 4. Januar in Deutschland , aber Ihre Funktion beginnt ab dem 1. Januar wieder ab 0 zu zählen. Am Jahresende werden auch falsche Zahlen zurückgegeben, z. B. 52 für den 31.11.2018 (53. Woche), obwohl es bereits die 1. Kalenderwoche 2019 ist : new Date(Date.UTC(2018,11, 31)).getWeek(1)+1(Montag ist der 1. Wochentag in Deutschland).
CodeManX
So war es beabsichtigt, und das ist, glaube ich, der wahrscheinlichste Anwendungsfall. Andernfalls würden die ersten 3 Tage des Jahres 2016 ausfallen. Die ersten Tage des Monats umfassen die erste Woche dieses Monats, unabhängig davon, welche und wie viele Tage es gibt. Wenn die Funktion anders funktionieren soll, können Sie sie Ihren Anforderungen entsprechend anpassen. Wenn eine Woche sowohl in das angegebene Jahr als auch in das folgende Jahr fällt, kann sie ebenso als die letzte Woche dieses Jahres sowie als die erste Woche des folgenden Jahres bezeichnet werden (gemäß der aktuellen Logik).
Tigran
Danke für die Information. Am Ende habe ich die RobG-Lösung verwendet, die die ISO8601-Wochendaten korrekt implementiert (die letzten Tage im Dezember und die ersten Tage im Januar können zur Woche 52, 53 oder 1 gehören: en.m.wikipedia.org/wiki/ISO_week_date
CodeManX
4

Holen Sie sich die Wochennummer eines bestimmten Datums

function week(year,month,day) {
    function serial(days) { return 86400000*days; }
    function dateserial(year,month,day) { return (new Date(year,month-1,day).valueOf()); }
    function weekday(date) { return (new Date(date)).getDay()+1; }
    function yearserial(date) { return (new Date(date)).getFullYear(); }
    var date = year instanceof Date ? year.valueOf() : typeof year === "string" ? new Date(year).valueOf() : dateserial(year,month,day), 
        date2 = dateserial(yearserial(date - serial(weekday(date-serial(1))) + serial(4)),1,3);
    return ~~((date - date2 + serial(weekday(date2) + 5))/ serial(7));
}

Beispiel

console.log(
    week(2016, 06, 11),//23
    week(2015, 9, 26),//39
    week(2016, 1, 1),//53
    week(2016, 1, 4),//1
    week(new Date(2016, 0, 4)),//1
    week("11 january 2016")//2
);
Hans Petersen
quelle
1
Ich kann es nicht glauben, aber diese Funktion ist die einzige, die die ganze Zeit funktioniert hat! Die akzeptierte Antwort spielte sich ab, als die Sommerzeit überschritten wurde, andere sagten in bestimmten Jahren '0' als Wochennummer. - und einige stützten sich auf UTC-Funktionen, die manchmal am Vortag zurückgegeben wurden, und wiesen ihr daher Woche '53' oder '54' zu. Leider muss die Woche an einem Sonntag beginnen und dieser Code ist sehr schwer zu verstehen ...
Melissa Zachariadis
@ MelissaZachariadis sagte I need the week to begin on a Sunday; Ich denke, die einzige notwendige Änderung ist in Funktion Wochentag () .getDay()+1zu ändern.getDay()
Rafa
4

Der folgende Code berechnet die korrekte ISO 8601-Wochennummer. Es entspricht den date("W")PHPs für jede Woche zwischen dem 1.1.1970 und dem 1.1.2100.

/**
 * Get the ISO week date week number
 */
Date.prototype.getWeek = function () {
  // Create a copy of this date object
  var target = new Date(this.valueOf());

  // ISO week date weeks start on Monday, so correct the day number
  var dayNr = (this.getDay() + 6) % 7;

  // ISO 8601 states that week 1 is the week with the first Thursday of that year
  // Set the target date to the Thursday in the target week
  target.setDate(target.getDate() - dayNr + 3);

  // Store the millisecond value of the target date
  var firstThursday = target.valueOf();

  // Set the target to the first Thursday of the year
  // First, set the target to January 1st
  target.setMonth(0, 1);

  // Not a Thursday? Correct the date to the next Thursday
  if (target.getDay() !== 4) {
    target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7);
  }

  // The week number is the number of weeks between the first Thursday of the year
  // and the Thursday in the target week (604800000 = 7 * 24 * 3600 * 1000)
  return 1 + Math.ceil((firstThursday - target) / 604800000);
}

Quelle: Taco van den Broek


Wenn Sie keine Prototypen erweitern möchten, finden Sie hier eine Funktion:

function getWeek(date) {
  if (!(date instanceof Date)) date = new Date();

  // ISO week date weeks start on Monday, so correct the day number
  var nDay = (date.getDay() + 6) % 7;

  // ISO 8601 states that week 1 is the week with the first Thursday of that year
  // Set the target date to the Thursday in the target week
  date.setDate(date.getDate() - nDay + 3);

  // Store the millisecond value of the target date
  var n1stThursday = date.valueOf();

  // Set the target to the first Thursday of the year
  // First, set the target to January 1st
  date.setMonth(0, 1);

  // Not a Thursday? Correct the date to the next Thursday
  if (date.getDay() !== 4) {
    date.setMonth(0, 1 + ((4 - date.getDay()) + 7) % 7);
  }

  // The week number is the number of weeks between the first Thursday of the year
  // and the Thursday in the target week (604800000 = 7 * 24 * 3600 * 1000)
  return 1 + Math.ceil((n1stThursday - date) / 604800000);
}

Beispielnutzung:

getWeek(); // Returns 37 (or whatever the current week is)
getWeek(new Date('Jan 2, 2011')); // Returns 52
getWeek(new Date('Jan 1, 2016')); // Returns 53
getWeek(new Date('Jan 4, 2016')); // Returns 1
thdoan
quelle
Ich mag diese Funktion, aber ich habe eine Frage; Was mache ich, wenn ich es wieder auf Sonntag setzen möchte? Ich habe keine Ahnung, was der +6 ) % 7Teil macht. Danke von einem Peeling!
NoobishPro
1
@Babydead ISO Woche beginnt an einem Montag, aber JavaScript getDay()beginnt an einem Sonntag. Wenn Sie also möchten, dass es am Sonntag beginnt, können Sie die Korrektur entfernen:var nDay = date.getDay();
thdoan
Ich habe über 8 verschiedene JS-Implementierungen ausprobiert, um die Wochennummer zu erhalten. Dies ist die einzige Funktion, die funktioniert, aber nur, wenn ich alle Getter und Setter auf getUTC .. und setUTC .. ändere. Ich weiß nicht warum. Ich habe damit getestet: 2017-07-17T00: 00: 00.000Z (Woche 29) 2017-07-23T23: 59: 59.000Z (Woche 29) 2021-01-04T00: 00: 00.000Z (Woche 1)
Psycho brm
2

Wenn Sie sich bereits in einem Angular-Projekt befinden, können Sie es verwenden $filter('date') .

Beispielsweise:

var myDate = new Date();
var myWeek = $filter('date')(myDate, 'ww');
Gabriel Furstenheim
quelle
2

Das Code-Snippet, das für mich ziemlich gut funktioniert, ist das folgende:

var yearStart = +new Date(d.getFullYear(), 0, 1);
var today = +new Date(d.getFullYear(),d.getMonth(),d.getDate());
var dayOfYear = ((today - yearStart + 1) / 86400000);
return Math.ceil(dayOfYear / 7).toString();

Hinweis:
dist mein Datum, für das ich die aktuelle Wochennummer haben möchte.
Das +konvertiert die Daten in Zahlen (arbeitet mit TypeScript).

Vasco
quelle
1

Hier ist meine Implementierung zur Berechnung der Wochennummer in JavaScript. korrigiert auch für Sommer- und Winterzeitversätze. Ich habe die Definition der Woche aus diesem Artikel verwendet: ISO 8601

Die Wochen sind von Montag bis Sonntag und der 4. Januar ist immer in der ersten Woche des Jahres.

// add get week prototype functions
// weeks always start from monday to sunday
// january 4th is always in the first week of the year
Date.prototype.getWeek = function () {
    year = this.getFullYear();
    var currentDotw = this.getWeekDay();
    if (this.getMonth() == 11 && this.getDate() - currentDotw > 28) {
        // if true, the week is part of next year 
        return this.getWeekForYear(year + 1);
    }
    if (this.getMonth() == 0 && this.getDate() + 6 - currentDotw < 4) {
        // if true, the week is part of previous year
        return this.getWeekForYear(year - 1);
    }
    return this.getWeekForYear(year);
}

// returns a zero based day, where monday = 0
// all weeks start with monday
Date.prototype.getWeekDay = function () {
    return  (this.getDay() + 6) % 7;
}

// corrected for summer/winter time
Date.prototype.getWeekForYear = function (year) {
    var currentDotw = this.getWeekDay();
    var fourjan = new Date(year, 0, 4);
    var firstDotw = fourjan.getWeekDay();
    var dayTotal = this.getDaysDifferenceCorrected(fourjan) // the difference in days between the two dates.
    // correct for the days of the week
    dayTotal += firstDotw; // the difference between the current date and the first monday of the first week, 
    dayTotal -= currentDotw; // the difference between the first monday and the current week's monday
    // day total should be a multiple of 7 now
    var weeknumber = dayTotal / 7 + 1; // add one since it gives a zero based week number.
    return weeknumber;
}

// corrected for timezones and offset
Date.prototype.getDaysDifferenceCorrected = function (other) {
    var millisecondsDifference = (this - other);
    // correct for offset difference. offsets are in minutes, the difference is in milliseconds
    millisecondsDifference += (other.getTimezoneOffset()- this.getTimezoneOffset()) * 60000;
    // return day total. 1 day is 86400000 milliseconds, floor the value to return only full days
    return Math.floor(millisecondsDifference / 86400000);
}

Zum Testen habe ich die folgenden JavaScript-Tests in Qunit verwendet

var runweekcompare = function(result, expected) {
    equal(result, expected,'Week nr expected value: ' + expected + ' Actual value: ' + result);
}

test('first week number test', function () {
    expect(5);
    var temp = new Date(2016, 0, 4); // is the monday of the first week of the year
    runweekcompare(temp.getWeek(), 1);
    var temp = new Date(2016, 0, 4, 23, 50); // is the monday of the first week of the year
    runweekcompare(temp.getWeek(), 1);
    var temp = new Date(2016, 0, 10, 23, 50); // is the sunday of the first week of the year
    runweekcompare(temp.getWeek(), 1);
    var temp = new Date(2016, 0, 11, 23, 50); // is the second week of the year
    runweekcompare(temp.getWeek(), 2);
    var temp = new Date(2016, 1, 29, 23, 50); // is the 9th week of the year
    runweekcompare(temp.getWeek(), 9);
});

test('first day is part of last years last week', function () {
    expect(2);
    var temp = new Date(2016, 0, 1, 23, 50); // is the first last week of the previous year
    runweekcompare(temp.getWeek(), 53);
    var temp = new Date(2011, 0, 2, 23, 50); // is the first last week of the previous year
    runweekcompare(temp.getWeek(), 52);
});

test('last  day is part of next years first week', function () {
    var temp = new Date(2013, 11, 30); // is part of the first week of 2014
    runweekcompare(temp.getWeek(), 1);
});

test('summer winter time change', function () {
    expect(2);
    var temp = new Date(2000, 2, 26); 
    runweekcompare(temp.getWeek(), 12);
    var temp = new Date(2000, 2, 27); 
    runweekcompare(temp.getWeek(), 13);
});

test('full 20 year test', function () {
    //expect(20 * 12 * 28 * 2);
    for (i = 2000; i < 2020; i++) {
        for (month = 0; month < 12; month++) {
            for (day = 1; day < 29 ; day++) {
                var temp = new Date(i, month, day);
                var expectedweek = temp.getWeek();
                var temp2 = new Date(i, month, day, 23, 50);
                var resultweek = temp.getWeek();
                equal(expectedweek, Math.round(expectedweek), 'week number whole number expected ' + Math.round(expectedweek) + ' resulted week nr ' + expectedweek);
                equal(resultweek, expectedweek, 'Week nr expected value: ' + expectedweek + ' Actual value: ' + resultweek + ' for year ' + i + ' month ' + month + ' day ' + day);
            }
        }
    }
});
martijn
quelle
0

Diese Woche Nummer Sache war ein echter Schmerz in der a **. Die meisten Skripte im Internet haben bei mir nicht funktioniert. Sie arbeiteten die meiste Zeit, aber alle brachen irgendwann zusammen, besonders als sich das Jahr änderte und die letzte Woche des Jahres plötzlich die erste Woche des nächsten Jahres war usw. Sogar Angulars Datumsfilter zeigte falsche Daten (es war die erste Woche des nächsten Jahres, gab Angular an Woche 53).

Hinweis: Beispiele sind für die Arbeit mit europäischen Wochen konzipiert (Mo zuerst)!

getWeek ()

Date.prototype.getWeek = function(){

    // current week's Thursday
    var curWeek = new Date(this.getTime());
        curWeek.setDay(4);

    // Get year's first week's Thursday
    var firstWeek = new Date(curWeek.getFullYear(), 0, 4);
        firstWeek.setDay(4);

    return (curWeek.getDayIndex() - firstWeek.getDayIndex()) / 7 + 1;
};

setDay ()

/**
* Make a setDay() prototype for Date
* Sets week day for the date
*/
Date.prototype.setDay = function(day){

    // Get day and make Sunday to 7
    var weekDay = this.getDay() || 7;
    var distance = day - weekDay;
    this.setDate(this.getDate() + distance);

    return this;
}

getDayIndex ()

/*
* Returns index of given date (from Jan 1st)
*/

Date.prototype.getDayIndex = function(){
    var start = new Date(this.getFullYear(), 0, 0);
    var diff = this - start;
    var oneDay = 86400000;

    return Math.floor(diff / oneDay);
};

Ich habe dies getestet und es scheint sehr gut zu funktionieren, aber wenn Sie einen Fehler darin bemerken, lassen Sie es mich bitte wissen.

Spacha
quelle
0

Ich habe viel versucht, den kürzesten Code zu erhalten, um die ISO-konforme Wochennummer zu erhalten.

Date.prototype.getWeek=function(){
    var date=new Date(this);
    date.setHours(0,0,0,0);
    return Math.round(((date.setDate(this.getDate()+2-(this.getDay()||7))-date.setMonth(0,4))/8.64e7+3+(date.getDay()||7))/7)+"/"+date.getFullYear();}

Die Variable dateist erforderlich, um eine Änderung des Originals zu vermeiden this. Ich habe die Rückgabewerte von verwendetsetDate() und setMonth()zum Verzichten verwendet getTime(), um die Codelänge zu sparen, und ich habe eine Expontialzahl für Millisekunden eines Tages anstelle einer Multiplikation einzelner Elemente oder einer Zahl mit fünf Nullen verwendet. thisist Datum oder Anzahl der Millisekunden, Rückgabewert ist StringzB "49/2017".

Sven Huber
quelle
0

Mit Luxon ( https://github.com/moment/luxon ):

import { DateTime } from 'luxon';
const week: number = DateTime.fromJSDate(new Date()).weekNumber;
NatoBoram
quelle
0

Eine weitere bibliotheksbasierte Option: Verwenden Sie d3-time-format:

const formatter = d3.timeFormat('%U');
const weekNum = formatter(new Date());
ericsoco
quelle
0

Kürzeste Problemumgehung für Angular2 + DatePipe, angepasst an ISO-8601:

import {DatePipe} from "@angular/common";

public rightWeekNum: number = 0;
  
constructor(private datePipe: DatePipe) { }
    
calcWeekOfTheYear(dateInput: Date) {
  let falseWeekNum = parseInt(this.datePipe.transform(dateInput, 'ww'));
  this.rightWeekNum = falseWeekNum ? falseWeekNum : falseWeekNum-1;
}
ConnectedMind
quelle
-1
now = new Date();
today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
firstOfYear = new Date(now.getFullYear(), 0, 1);
numOfWeek = Math.ceil((((today - firstOfYear) / 86400000)-1)/7);
Le Dang Duong
quelle