Dapatkan minggu dalam setahun JavaScript seperti di PHP

140

Bagaimana saya mendapatkan jumlah minggu kerja tahun ini, seperti PHP date('W')?

Itu harus merupakan angka minggu ISO-8601 tahun, minggu-minggu mulai hari Senin.

PeeHaa
sumber
1
Lihat <a href=" javascript.about.com/library/blweekyear.htm "> <b> di sini </b> </a>, yang merupakan tautan pertama yang diberikan ketika saya googled 'minggu javascript tahun'.
Pete Wilson
+1 Lol! Di situlah saya mendapatkan cuplikan dari diri saya sendiri, tetapi saya tidak dapat mengingat sumbernya seperti yang saya dapatkan beberapa saat yang lalu.
Tom Chantler
@Pete: Kode itu mendapat 22 sebagai minggu ini. Sementara seharusnya 21
PeeHaa
@Pete:: D Nopez -1 sederhana tidak akan melakukan trik: P Itu tidak akan mendapatkan ISO-8601 weeknumber. Seminggu di ISO-8601 dimulai pada hari Senin. Minggu pertama adalah minggu dengan tahun Kamis pertama di dalamnya. en.wikipedia.org/wiki/ISO-8601 . PS bukan saya yang menurunkan Anda.
PeeHaa

Jawaban:

276

Anda harus bisa mendapatkan yang Anda inginkan di sini: http://www.merlyn.demon.co.uk/js-date6.htm#YWD .

Tautan yang lebih baik di situs yang sama adalah: Bekerja dengan minggu .

Edit

Berikut adalah beberapa kode berdasarkan tautan yang disediakan dan yang diposting sebelumnya oleh Dommer. Ini telah diuji ringan terhadap hasil di http://www.merlyn.demon.co.uk/js-date6.htm#YWD . Silakan uji dengan seksama, tidak ada jaminan yang diberikan.

Edit 2017

Ada masalah dengan tanggal selama periode bahwa daylight saving diamati dan tahun-tahun di mana 1 Jan adalah hari Jumat. Diperbaiki dengan menggunakan semua metode UTC. Berikut ini mengembalikan hasil yang identik ke 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]);

Jam diunggulkan saat membuat tanggal "UTC".

Diminimalkan, versi prototipe (hanya mengembalikan angka minggu):

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

Bagian tes

Di bagian ini, Anda dapat memasukkan tanggal apa pun dalam format YYYY-MM-DD dan memeriksa apakah kode ini memberikan angka minggu yang sama dengan angka minggu ISO Moment.js (diuji selama 50 tahun dari 2000 hingga 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
sumber
8
Kode ini menghitung 2 Januari 2011 sebagai minggu ke-53 tahun 2010 yang seharusnya menjadi yang ke-52. Ini berfungsi dengan benar dalam kode asli tetapi tidak dalam adaptasi Anda.
Alasdair
4
Anda menyelamatkan pantat saya. Terima kasih. Jika Anda ingin berkontribusi ke Open Source, saya sarankan Anda membuat patch untuk metode jQuery UI: $ .datepicker.iso8601Week (tanggal) karena hanya mengembalikan weekNo, tetapi tidak ada tahun.
Christian
18
Hari ini, 4 Januari 2016, saya perhatikan bahwa perlu juga menambahkan d.setMilliseconds(0)- itu terus menunjukkan angka minggu yang berbeda untuk tanggal yang sama tergantung pada apakah saya menggunakan Tanggal baru () atau Tanggal baru ("1/4/2016"). Hanya kepala untuk orang lain yang mungkin mengalami hal yang sama.
Jacob Lauritzen
2
Kode yang diberikan tidak mengikuti ISO 8601, tidak aktif satu per satu
Eric Grange
2
Ups, Anda benar, salah ketik saya, seharusnya '2015-12-30' yang berfungsi.
Ally
39

Anda dapat menggunakan perpustakaan momentjs juga:

moment().format('W')

enam hari
sumber
9
ataumoment().week()
Alex78191
25

Seperti dikatakan di atas tetapi tanpa kelas:

let now = new Date();
let onejan = new Date(now.getFullYear(), 0, 1);
week = Math.ceil( (((now - onejan) / 86400000) + onejan.getDay() + 1) / 7 );
nvd
sumber
4
one-jan-tang! * ninja-roll *
CodeManX
2
Ini adalah satu-satunya jawaban yang mendapatkan angka minggu yang benar bahkan untuk minggu pertama tahun itu.
PrasadW
Catatan yang harus dilakukan (now.getTime() - onejan.getTime())untuk menghindari masalah pembangunan.
Swoox
4
Pertanyaannya meminta ISO 8601 yang diabaikan ini. Sebagai jawaban untuk pertanyaan itu salah
havlock
23

Accordily 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
sumber
1
Ringkas, tetapi memperlakukan hari Minggu sebagai hari pertama dalam seminggu sehingga hari Minggu tanggal 27 Desember 2015 adalah hari pertama dalam minggu ke 53 daripada hari terakhir di minggu ke 52. Itu mungkin cocok untuk beberapa orang.
RobG
3
Saya pikir karena ini sedang ditambahkan ke prototipe itu yang Anda harapkan sebagai Date memperlakukan minggu sebagai hari pertama.
Ed Sykes
Apakah ini tidak akan ada masalah pada hari-hari Daylight Saving Time? Saya pikir itu tidak akan maju sampai 01:00 selama musim panas.
Hafthor
Juga, bukankah ini secara teknis tidak naik seminggu sampai 0: 00: 00.001? Lebih baik menggunakan Math.floor?
Hafthor
11

Date.format()Pustaka Jacob Wright mengimplementasikan pemformatan tanggal dengan gaya date()fungsi PHP dan mendukung angka minggu ISO-8601:

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

Mungkin sedikit berlebihan untuk hanya satu minggu, tetapi mendukung format PHP dan sangat berguna jika Anda akan melakukan banyak hal.

Brad Koch
sumber
Solusi yang bagus untuk skrip yang diretas cepat :)
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;
    }

Kode berikut adalah independen zona waktu (tanggal UTC digunakan) dan berfungsi sesuai dengan https://en.wikipedia.org/wiki/ISO_8601

Dmitry Volokh
sumber
4

Saya menemukan kelas SimpleDateFormat Java SE yang dijelaskan pada spesifikasi Oracle: http://goo.gl/7MbCh5 . Dalam kasus saya di Google Apps Script berfungsi seperti ini:

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

Misalnya dalam makro spreadsheet Anda dapat mengambil zona waktu file yang sebenarnya:

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

Ini menambahkan metode "getWeek" ke Date.prototype yang mengembalikan jumlah minggu dari awal tahun. Argumen mendefinisikan hari mana dalam minggu untuk mempertimbangkan yang pertama. Jika tidak ada argumen yang lolos, hari pertama diasumsikan hari Minggu.

/**
 * 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
sumber
1
Minggu kalender pertama 2016 dimulai pada 4 Januari di Jerman , tetapi fungsi Anda mulai menghitung lagi dari 0 dari 1 Januari pada. Ini juga mengembalikan angka yang salah pada akhir tahun, misalnya 52 untuk 2018-11-31 (minggu ke-53), meskipun sudah menjadi minggu kalender pertama tahun 2019 : new Date(Date.UTC(2018,11, 31)).getWeek(1)+1(Senin adalah hari pertama di Jerman).
CodeManX
Begitulah yang dimaksudkan, dan itulah, saya percaya, kasus penggunaan yang paling mungkin. Kalau tidak, 3 hari pertama 2016 akan jatuh. Hari pertama dalam bulan itu dianggap terdiri dari minggu pertama untuk bulan itu, tidak peduli hari apa dan berapa hari. Jika Anda membutuhkan fungsi untuk bekerja secara berbeda, Anda dapat menyesuaikannya sesuai dengan kebutuhan Anda. Demikian juga, jika satu minggu jatuh ke tahun yang diberikan dan tahun berikutnya, itu bisa disebut minggu terakhir tahun itu, serta minggu pertama tahun berikutnya (sesuai dengan logika saat ini).
Tigran
Terimakasih atas infonya. Saya akhirnya menggunakan solusi RobG, yang mengimplementasikan tanggal minggu ISO8601 dengan benar (hari-hari terakhir di bulan Desember dan hari-hari pertama di bulan Januari mungkin termasuk minggu ke 52, 53 atau 1: en.m.wikipedia.org/wiki/ISO_week_date
CodeManX
4

Dapatkan jumlah minggu dari Tanggal yang diberikan

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

Contoh

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
sumber
1
Saya tidak percaya, tapi fungsi ini adalah satu-satunya yang berfungsi sepanjang waktu! Jawaban yang diterima diputar ketika melewati penghematan siang hari, yang lain mengatakan '0' sebagai angka minggu pada tahun-tahun tertentu. - dan beberapa mengandalkan fungsi UTC yang terkadang kembali pada hari sebelumnya sehingga menugaskannya minggu '53' atau '54'. Sayangnya saya memerlukan minggu untuk memulai pada hari Minggu dan kode ini sangat sulit untuk dipahami ...
Melissa Zachariadis
@MelissaZachariadis berkata I need the week to begin on a Sunday; Saya pikir satu-satunya perubahan yang diperlukan adalah fungsi weekday () .getDay()+1akan diubah menjadi.getDay()
Rafa
4

Kode di bawah ini menghitung angka minggu ISO 8601 yang benar. Ini cocok dengan PHP date("W")untuk setiap minggu antara 1/1/1970 dan 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);
}

Sumber: Taco van den Broek


Jika Anda tidak memperluas prototipe, maka inilah fungsinya:

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

Penggunaan sampel:

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
Terima kasih
sumber
Saya suka fungsi ini, tetapi saya punya pertanyaan; Apa yang harus saya lakukan jika saya ingin mengembalikannya ke minggu? Saya tidak tahu apa +6 ) % 7bagiannya. Terima kasih dari scrub!
NoobishPro
1
@Babydead ISO minggu dimulai pada hari Senin, tetapi JavaScript getDay()dimulai pada hari Minggu, jadi jika Anda ingin memulai pada hari Minggu maka Anda dapat menghapus koreksi:var nDay = date.getDay();
thdoan
Saya sudah mencoba lebih dari 8 implementasi JS yang berbeda untuk mendapatkan nomor minggu. Ini adalah satu-satunya fungsi yang berfungsi, tetapi hanya jika saya mengubah semua getter dan setter ke getUTC .. dan setUTC .. Tidak tahu mengapa. Saya menguji dengan ini: 2017-07-17T00: 00: 00.000Z (minggu 29) 2017-07-23T23: 59: 59.000Z (minggu 29) 2021-01-04T00: 00: 00.000Z (minggu 1)
psiko brm
2

Jika Anda sudah berada dalam proyek Angular, Anda dapat menggunakan $filter('date') .

Sebagai contoh:

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

Cuplikan kode yang berfungsi cukup baik bagi saya adalah yang ini:

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

Catatan:
dadalah Tanggal saya yang saya inginkan nomor minggu saat ini.
The +bertobat dengan Tanggal ke nomor (bekerja dengan naskah).

Vasco
sumber
1

Inilah implementasi saya untuk menghitung angka minggu dalam JavaScript. dikoreksi untuk offset waktu musim panas dan musim dingin juga. Saya menggunakan definisi minggu ini dari artikel ini: ISO 8601

Minggu-minggu dari Senin hingga Minggu, dan 4 Januari selalu di minggu pertama tahun ini.

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

untuk pengujian saya menggunakan tes JavaScript berikut di 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
sumber
0

Angka minggu ini benar-benar menyakitkan di a **. Sebagian besar skrip di internet tidak bekerja untuk saya. Mereka bekerja sebagian besar waktu tetapi semuanya pecah di beberapa titik, terutama ketika tahun berubah dan minggu terakhir tahun itu tiba-tiba minggu pertama tahun dll. Bahkan filter tanggal Angular menunjukkan data yang salah (itu adalah minggu ke-1 tahun depan, angular memberi minggu 53).

Catatan: Contoh dirancang untuk bekerja dengan minggu Eropa (Senin dulu)!

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

Saya telah menguji ini dan tampaknya berfungsi dengan sangat baik tetapi jika Anda melihat ada cacat di dalamnya, beri tahu saya.

Spacha
sumber
0

Saya mencoba banyak untuk mendapatkan kode terpendek untuk mendapatkan ISO-conform weeknumber.

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

Variabel datediperlukan untuk menghindari mengubah yang asli this. Saya menggunakan nilai kembali setDate()dan setMonth()untuk membuang getTime()untuk menghemat panjang kode dan saya menggunakan nomor ekspektasi selama milidetik sehari, bukan perkalian elemen tunggal atau angka dengan lima nol. thisadalah Tanggal atau Jumlah milidetik, nilai kembali adalah Stringmis. "49/2017".

Sven Huber
sumber
0

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

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

Opsi berbasis pustaka lain: gunakan d3-time-format:

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

Penanganan terpendek untuk Angular2 + DatePipe, disesuaikan untuk 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;
}
terhubungMind
sumber
-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
sumber