Pobierz tydzień roku w JavaScript jak w PHP

140

Jak uzyskać bieżący numer tygodnia w roku, taki jak PHP date('W')?

Powinien to być numer tygodnia w roku ISO-8601 , tygodnie rozpoczynające się w poniedziałek.

PeeHaa
źródło
1
Spójrz <a href=" javascript.about.com/library/blweekyear.htm "> <b> tutaj </b> </a>, który był pierwszym linkiem podanym, gdy wpisałem w Google „tydzień roku javascript”.
Pete Wilson
+1 Lol! Stąd wziąłem od siebie fragment kodu, ale nie mogłem sobie przypomnieć źródła, ponieważ dostałem go jakiś czas temu.
Tom Chantler
@Pete: Ten kod otrzymuje 22 jako bieżący tydzień. Chociaż powinno być 21
PeeHaa
@Pete:: D Nopez proste -1 nie załatwi sprawy: P To by nie dało numeru tygodnia ISO-8601. Tydzień w ISO-8601 zaczyna się w poniedziałek. Pierwszy tydzień to tydzień z pierwszym czwartkiem roku. en.wikipedia.org/wiki/ISO-8601 . PS to nie ja cię zlekceważyłem.
PeeHaa

Odpowiedzi:

276

Powinieneś być w stanie uzyskać to, czego chcesz, tutaj: http://www.merlyn.demon.co.uk/js-date6.htm#YWD .

Lepszy link w tej samej witrynie to: Praca z tygodniami .

Edytować

Oto kod oparty na podanych linkach i opublikowany przez Dommera. Został lekko przetestowany z wynikami pod adresem http://www.merlyn.demon.co.uk/js-date6.htm#YWD . Prosimy o dokładne przetestowanie, bez gwarancji.

Edytuj 2017

Wystąpił problem z datami w okresie, w którym obserwowano czas letni i latami, w których 1 stycznia przypadał w piątek. Naprawiono przy użyciu wszystkich metod UTC. Poniższe zwraca identyczne wyniki jak Moment.js.

/* 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]);

Podczas tworzenia daty „UTC” godziny są zerowane.

Zminimalizowana wersja prototypowa (zwraca tylko numer tygodnia):

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());

Sekcja testowa

W tej sekcji możesz wprowadzić dowolną datę w formacie RRRR-MM-DD i sprawdzić, czy ten kod podaje ten sam numer tygodnia, co numer tygodnia w Moment.js ISO (testowany przez 50 lat od 2000 do 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
źródło
8
Ten kod oblicza 2 stycznia 2011 jako 53. tydzień 2010, gdzie powinien być 52. tydzień. Działa to poprawnie w oryginalnym kodzie, ale nie w Twojej adaptacji.
Alasdair
4
Uratowałeś mój tyłek. Dzięki. Jeśli chcesz wnieść swój wkład w Open Source, sugeruję utworzenie łatki dla metody jQuery UI: $ .datepicker.iso8601Week (data), ponieważ zwraca ona tylko tydzieńNo, ale nie rok.
Christian
18
Dzisiaj, 4 stycznia 2016 r., Zauważyłem, że trzeba było również dodać d.setMilliseconds(0)- pokazywał różne numery tygodni dla tej samej daty, w zależności od tego, czy użyłem nowej daty (), czy nowej daty („1/4/2016”). Tylko jedno ostrzeżenie dla innych, którzy mogą doświadczyć tego samego.
Jacob Lauritzen
2
Podany kod nie jest zgodny z ISO 8601, jest mniejszy o jeden
Eric Grange
2
Ups masz rację, moja literówka miała brzmieć „2015-12-30”, co działa.
Ally
39

Możesz również skorzystać z biblioteki momentjs:

moment().format('W')

sześć dni
źródło
9
lubmoment().week()
Alex78191
26

Jak wspomniano powyżej, ale bez klasy:

let now = new Date();
let onejan = new Date(now.getFullYear(), 0, 1);
week = Math.ceil( (((now - onejan) / 86400000) + onejan.getDay() + 1) / 7 );
nvd
źródło
4
one-jan-tang! * ninja-roll *
CodeManX
2
To jedyna odpowiedź, która pobiera prawidłowy numer tygodnia nawet dla pierwszego tygodnia roku.
Prasad W,
Uwaga, (now.getTime() - onejan.getTime())aby uniknąć problemów z kompilacją.
Swoox
4
Pytanie zadane dla ISO 8601, które to ignoruje. Odpowiadając na to pytanie, jest po prostu błędna
havlock
23

Zgodnie z 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
źródło
1
Zwięzłe, ale traktuje niedzielę jako pierwszy dzień tygodnia, więc niedziela 27 grudnia 2015 jest pierwszym dniem 53 tygodnia, a nie ostatnim dniem 52 tygodnia.
RobG,
3
Myślę, że skoro to jest dodawane do prototypu, tego można się spodziewać, ponieważ Date traktuje niedzielę jako pierwszy dzień.
Ed Sykes,
Czy nie będzie to powodować problemów w dniach czasu letniego? Myślę, że latem nastąpi to dopiero o 1 w nocy.
Hafthor
Poza tym, czy to technicznie nie przyspieszy tygodnia do 0: 00: 00.001? Lepiej używać Math.floor?
Hafthor
11

Date.format()Biblioteka Jacoba Wrighta implementuje formatowanie daty w stylu funkcji PHP date()i obsługuje numer tygodnia ISO-8601:

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

Może to być trochę przesada jak na numer tygodnia, ale obsługuje formatowanie w stylu PHP i jest całkiem przydatne, jeśli będziesz to robić dużo.

Brad Koch
źródło
Dobre rozwiązanie na szybkie zhakowane skrypty :)
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;
    }

Poniższy kod jest niezależny od strefy czasowej (używane daty UTC) i działa zgodnie z https://en.wikipedia.org/wiki/ISO_8601

Dmitry Volokh
źródło
4

Przydatna okazała się klasa SimpleDateFormat Java SE opisana w specyfikacji Oracle: http://goo.gl/7MbCh5 . W moim przypadku w Google Apps Script działało to tak:

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

Na przykład w makrze arkusza kalkulacyjnego możesz pobrać aktualną strefę czasową pliku:

function getWeekNumber() {
  var weekNum = parseInt(Utilities.formatDate(new Date(), SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(), "w"));
  Logger.log(weekNum);
}
Balu Ertl
źródło
4

To dodaje metodę „getWeek” do Date.prototype, która zwraca numer tygodnia od początku roku. Argument określa, który dzień tygodnia należy wziąć pod uwagę jako pierwszy. Jeśli nie podano argumentu, przyjmuje się, że pierwszy dzień to niedziela.

/**
 * 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
źródło
1
Pierwszy tydzień kalendarzowy 2016 zaczyna się w Niemczech 4 stycznia , ale od 1 stycznia Twoja funkcja zaczyna się od 0. Zwraca również błędne liczby na koniec roku, np. 52 dla 31.11.2018 (53. tydzień), chociaż jest to już pierwszy tydzień kalendarzowy 2019 r . : new Date(Date.UTC(2018,11, 31)).getWeek(1)+1(poniedziałek jest pierwszym dniem tygodnia w Niemczech).
CodeManX
Tak było i uważam, że jest to najbardziej prawdopodobny przypadek użycia. W przeciwnym razie wypadłyby pierwsze 3 dni 2016 roku. Za pierwsze dni miesiąca uważa się pierwszy tydzień tego miesiąca, bez względu na to, które i ile dni jest. Jeśli chcesz, aby funkcja działała inaczej, możesz ją dostosować do swoich potrzeb. Podobnie, jeśli tydzień przypada zarówno na dany rok, jak i na rok następny, można go nazwać ostatnim tygodniem tego roku, a także pierwszym tygodniem roku następnego (zgodnie z obowiązującą logiką).
Tigran
Dzięki za informację. Skończyło się na rozwiązaniu RobG, które poprawnie implementuje daty tygodnia ISO8601 (ostatnie dni grudnia i pierwsze dni stycznia mogą należeć do tygodnia 52, 53 lub 1: en.m.wikipedia.org/wiki/ISO_week_date
CodeManX
4

Uzyskaj numer tygodnia z dowolnej daty

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));
}

Przykład

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
źródło
1
Nie mogę w to uwierzyć, ale ta funkcja jako jedyna działała cały czas! Przyjęta odpowiedź pojawiła się, gdy minęła godzina letnia, inni mówili „0” jako numer tygodnia w niektórych latach. - a niektórzy polegali na funkcjach UTC, które czasami zwracały poprzedni dzień, przypisując mu tydzień „53” lub „54”. Niestety, potrzebuję tygodnia, aby zaczął się w niedzielę, a ten kod jest bardzo trudny do zrozumienia ...
Melissa Zachariadis
@MelissaZachariadis powiedział I need the week to begin on a Sunday; Myślę, że jedyną potrzebną zmianą jest zmiana funkcji dnia tygodnia () .getDay()+1na.getDay()
Rafa
4

Poniższy kod oblicza prawidłowy numer tygodnia ISO 8601. date("W")Odpowiada PHP dla każdego tygodnia między 01.01.1970 a 01.01.2021.

/**
 * 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);
}

Źródło: Taco van den Broek


Jeśli nie interesujesz się rozszerzaniem prototypów, oto funkcja:

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);
}

Przykładowe użycie:

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
źródło
Podoba mi się ta funkcja, ale mam pytanie; Co mam zrobić, jeśli chcę odłożyć to na niedzielę? Nie mam pojęcia, co +6 ) % 7robi ta część. Dzięki od zarośla!
NoobishPro
1
@Babydead tydzień ISO zaczyna się w poniedziałek, ale JavaScript getDay()zaczyna się w niedzielę, więc jeśli chcesz, aby zaczął się w niedzielę, możesz usunąć korektę:var nDay = date.getDay();
czw
Wypróbowałem ponad 8 różnych implementacji JS do pobierania numeru tygodnia. To jedyna funkcja, która działa, ale tylko jeśli zmienię wszystkie metody pobierające i ustawiające na getUTC .. i setUTC .. Nie wiem dlaczego. Testowałem z tym: 2017-07-17T00: 00: 00.000Z (tydzień 29) 2017-07-23T23: 59: 59.000Z (tydzień 29) 2021-01-04T00: 00: 00.000Z (tydzień 1)
psycho brm
2

Jeśli jesteś już w projekcie Angular, możesz użyć $filter('date').

Na przykład:

var myDate = new Date();
var myWeek = $filter('date')(myDate, 'ww');
Gabriel Furstenheim
źródło
2

Fragment kodu, który działa całkiem nieźle, to ten:

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();

Uwaga:
dto moja data, dla której chcę podać numer bieżącego tygodnia.
W +konwertuje daty na postać cyfrową (praca z maszynopis).

Vasco
źródło
1

Oto moja implementacja do obliczania numeru tygodnia w JavaScript. skorygowane również o przesunięcia czasu letniego i zimowego. Użyłem definicji tygodnia z tego artykułu: ISO 8601

Tygodnie są od poniedziałku do niedzieli, a 4 stycznia jest zawsze pierwszym tygodniem roku.

// 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);
}

do testów użyłem następujących testów JavaScript w Qunit

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
źródło
0

Ten numer tygodnia był prawdziwym wrzodem na punkcie a **. Większość skryptów w sieci nie działała dla mnie. Pracowały przez większość czasu, ale wszystkie w pewnym momencie się zepsuły, zwłaszcza gdy zmienił się rok, a ostatni tydzień roku był nagle pierwszym tygodniem przyszłego roku itd. Nawet filtr dat w Angular pokazał nieprawidłowe dane (był to pierwszy tydzień przyszłego roku, angular dał 53 tydzień).

Uwaga: przykłady są przeznaczone do pracy z tygodniami europejskimi (najpierw poniedziałek)!

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);
};

Przetestowałem to i wygląda na to, że działa bardzo dobrze, ale jeśli zauważysz w nim usterkę, daj mi znać.

Spacha
źródło
0

Bardzo się starałem, aby uzyskać jak najkrótszy kod, aby numer tygodnia był zgodny z ISO.

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();}

Zmienna datejest konieczna, aby uniknąć zmiany oryginału this. Użyłem zwracanych wartości setDate()i, setMonth()aby zrezygnować z getTime()zapisywania długości kodu, a zamiast mnożenia pojedynczych elementów lub liczby z pięcioma zerami użyłem liczby wykładniczej dla milisekund dnia. thisto Data lub Liczba milisekund, zwracana wartość to Stringnp. „49/2017”.

Sven Huber
źródło
0

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

import { DateTime } from 'luxon';
const week: number = DateTime.fromJSDate(new Date()).weekNumber;
NatoBoram
źródło
0

Inna opcja oparta na bibliotece: użyj d3-time-format:

const formatter = d3.timeFormat('%U');
const weekNum = formatter(new Date());
ericsoco
źródło
0

Najkrótsze obejście dla Angular2 + DatePipe, dostosowane do 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
źródło
-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
źródło