Cara mendapatkan hari pertama dan terakhir dalam seminggu di JavaScript

97

Saya memiliki today = new Date();objek. Saya harus mendapatkan hari pertama dan terakhir dari minggu ini. Saya membutuhkan kedua varian untuk hari Minggu dan Senin sebagai hari awal dan akhir dalam seminggu. Saya agak bingung sekarang dengan kode. Bisakah Anda membantu saya?

Petya petrov
sumber

Jawaban:

195
var curr = new Date; // get current date
var first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week
var last = first + 6; // last day is the first day + 6

var firstday = new Date(curr.setDate(first)).toUTCString();
var lastday = new Date(curr.setDate(last)).toUTCString();

firstday
"Sun, 06 Mar 2011 12:25:40 GMT"
lastday
"Sat, 12 Mar 2011 12:25:40 GMT"

Ini berlaku untuk hari pertama = minggu minggu ini dan hari terakhir = Sabtu untuk minggu ini. Memperpanjangnya untuk berjalan dari Senin hingga Minggu itu sepele.

Menjadikannya bekerja dengan hari pertama dan terakhir di bulan yang berbeda dibiarkan sebagai latihan bagi pengguna

Raynos
sumber
terima kasih, bagaimana saya bisa membuat ini tetapi kapan hari pertama adalah hari senin?
JuanPablo
4
var first = curr.getDate() - curr.getDay() +1;
JuanPablo
40
Untuk membuatnya bekerja saat Anda memiliki bulan yang berbeda -var lastday = new Date(curr.setDate(first.getDate()+6)).toUTCString();
Richard N
2
Kode yang mirip dengan jawaban @Rayons, tetapi ini akan berfungsi bahkan untuk bulan dan tahun lainnya juga var curr = new Date('2014-10-01T00:00:00'); // get current date var first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week var last = first + 6; // last day is the first day + 6 firstday = new Date(curr.setDate(first)).toUTCString(); lastday = new Date(curr.setDate(curr.getDate()+6)).toUTCString(); hanya saja saya telah mengoreksi kode @ RichardN, yang mengalami kesalahan kecil
Azeez
65
"sebagai latihan untuk pengguna"… benarkah?
adius
63

Hati-hati dengan jawaban yang diterima, ini tidak mengatur waktu ke 00:00:00 dan 23:59:59, jadi Anda bisa mendapat masalah.

Anda dapat menggunakan perpustakaan tanggal pihak ketiga untuk menangani tanggal. Sebagai contoh:

var startOfWeek = moment().startOf('week').toDate();
var endOfWeek   = moment().endOf('week').toDate();

EDIT: Mulai September 2020, menggunakan Momen tidak disarankan untuk proyek baru ( entri blog )

Alternatif populer lainnya adalah date-fns .

Bruno Lemos
sumber
20
Jika Anda menggunakan momen, gunakan "minggu isoweek" daripada "minggu" jika tidak maka minggu akan dimulai dari hari Minggu dan akan mengakhirinya pada hari Sabtu jadi var startOfWeek = moment().startOf('isoweek').toDate(); var endOfWeek = moment().endOf('isoweek').toDate();
Brugolo
Terima kasih kalian menghemat waktu saya :-)
Syed Ehtsham Abbas
1
Untuk menghitung waktu tanpa menggunakan moment.js, gunakan Date.setHours: curr.setHours (0,0,0,0); lastday.setHours (23,59,59,59);
matadur
harus 'isoWeek' bukan 'isoweek'
Mayur Saner
Momen cinta js, salah satu tanggal / waktu terbaik di luar sana!
Vippy
50

Anda juga dapat menggunakan baris kode berikut untuk mendapatkan tanggal pertama dan terakhir dalam seminggu:

var curr = new Date;
var firstday = new Date(curr.setDate(curr.getDate() - curr.getDay()));
var lastday = new Date(curr.setDate(curr.getDate() - curr.getDay()+6));

Semoga bermanfaat ..

Vasant PADHIYAR
sumber
2
Ya, Tapi @totymedii, jawaban Raynos salah untuk 1 Maret 2019, saya punya buktinya, hari pertama :: Min, 24 Feb 2019 08:33:48 GMT hari terakhir :: Sab, 02 Feb 2019 08:33:48 GMT
Deepak Patel
14

Berikut cara cepat untuk mendapatkan hari pertama dan terakhir, untuk hari awal apa pun. mengetahui bahwa:

1 hari = 86.400.000 milidetik.

Nilai tanggal JS dalam milidetik

Resep: cari tahu berapa hari yang perlu Anda hapus untuk mendapatkan hari awal minggu Anda (kalikan dengan 1 hari dalam milidetik). Semua yang tersisa setelah itu adalah menambahkan 6 hari untuk mendapatkan hari akhir Anda.

var startDay = 1; //0=sunday, 1=monday etc.
var d = now.getDay(); //get the current day
var weekStart = new Date(now.valueOf() - (d<=0 ? 7-startDay:d-startDay)*86400000); //rewind to start day
var weekEnd = new Date(weekStart.valueOf() + 6*86400000); //add 6 days to get last day
Olivier
sumber
3
Ini tidak berhasil karena hari tidak selalu sepanjang 86.400.000 milidetik berkat DST ...
ValarDohaeris
10

Library date-fns yang sangat baik (dan tidak dapat diubah) menangani ini dengan paling singkat:

const start = startOfWeek(date);
const end = endOfWeek(date);

Hari awal default dalam seminggu adalah Minggu (0), tetapi dapat diubah menjadi Senin (1) seperti ini:

const start = startOfWeek(date, {weekStartsOn: 1});
const end = endOfWeek(date, {weekStartsOn: 1});
Freewalker
sumber
1
ditambah 1 untuk menggunakan tanggal-fns dan bukan momen
CENT1PEDE
@RobG Metode apa pun yang Anda gunakan akan memiliki hari pertama default dalam seminggu.
Freewalker
4

Anda bisa melakukan sesuatu seperti ini

var today = new Date();
var startDay = 0; 
var weekStart = new Date(today.getDate() - (7 + today.getDay() - startDay) % 7);
var weekEnd = new Date(today.getDate() + (7 - today.getDay() - startDay) % 7);

Dimana startDayadalah angka dari 0 sampai 6 dimana 0 berarti Minggu (yaitu 1 = Senin, 2 = Selasa, dll).

krtek
sumber
3

SetDateakan menetapkan hari dalam sebulan. Menggunakan setDateselama awal dan akhir bulan, akan menghasilkan minggu yang salah

var curr = new Date("08-Jul-2014"); // get current date
var first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week
var last = first + 6; // last day is the first day + 6
var firstday = new Date(curr.setDate(first)); // 06-Jul-2014
var lastday = new Date(curr.setDate(last)); //12-Jul-2014

Jika Anda menyetel Tanggal adalah 01-Jul-2014, maka hari pertama akan ditampilkan sebagai 29-Jun-2014 dan hari terakhir sebagai 05-Jun-2014 bukannya 05-Jul-2014

Jadi atasi masalah ini yang saya gunakan

var curr = new Date();
day = curr.getDay();
firstday = new Date(curr.getTime() - 60*60*24* day*1000); //will return firstday (ie sunday) of the week
lastday = new Date(curr.getTime() + 60 * 60 *24 * 6 * 1000); //adding (60*60*6*24*1000) means adding six days to the firstday which results in lastday (saturday) of the week
Anggrek
sumber
" Menggunakan setDate selama awal dan akhir bulan, akan menghasilkan minggu yang salah " tidak jika digunakan dengan benar.
RobG
3

Ini bekerja sepanjang tahun dan perubahan bulan.

Date.prototype.GetFirstDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay())));
}

Date.prototype.GetLastDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay() +6)));
}

var today = new Date();

alert(today.GetFirstDayOfWeek());

alert(today.GetLastDayOfWeek());
Chris Lang
sumber
Sekarang sepertinya berlebihan. smh
Chris Lang
Dan selama berminggu-minggu mulai hari Senin?
RobG
@RobG Silakan lihat ini
SHIVA
2

Saya merekomendasikan untuk menggunakan Moment.js untuk kasus seperti itu. Saya punya skenario di mana saya harus memeriksa waktu tanggal saat ini, minggu ini, bulan ini dan waktu tanggal kuartal ini. Di atas jawaban membantu saya jadi saya berpikir untuk berbagi fungsi lainnya juga.

Cukup untuk mendapatkan waktu tanggal saat ini dalam format tertentu

        case 'Today':
        moment().format("DD/MM/YYYY h:mm A");

        case 'This Week':
          moment().endOf('isoweek').format("DD/MM/YYYY h:mm A");

Minggu dimulai dari hari Minggu dan berakhir pada hari Sabtu jika kita hanya menggunakan 'minggu' sebagai parameter untuk fungsi endOf tetapi untuk mendapatkan hari Minggu sebagai akhir minggu kita perlu menggunakan 'minggu isoweek'.

        case 'This Month':
          moment().endOf('month').format("DD/MM/YYYY h:mm A");

        case 'This Quarter':
          moment().endOf('quarter').format("DD/MM/YYYY h:mm A");

Saya memilih format ini sesuai kebutuhan saya. Anda dapat mengubah format sesuai kebutuhan Anda.

Syed Ehtsham Abbas
sumber
Moment.js sekarang menjadi proyek lama dan tidak akan menerima pembaruan signifikan lebih lanjut: github.com/moment/moment#project-status
Freewalker
2
        //get start of week; QT
    function _getStartOfWeek (date){
        var iDayOfWeek = date.getDay();
        var iDifference = date.getDate() - iDayOfWeek + (iDayOfWeek === 0 ?  -6:1);

        return new Date(date.setDate(iDifference));
    }, 

    function _getEndOfWeek(date){
        return new Date(date.setDate(date.getDate() + (7 - date.getDay()) === 7 ? 0 : (7 - date.getDay()) ));
    }, 

* tanggal saat ini == 30.06.2016 dan senin adalah hari pertama dalam seminggu.

Ia juga bekerja untuk bulan dan tahun yang berbeda. Diuji dengan suite qunit:

masukkan deskripsi gambar di sini

        QUnit.module("Planung: Start of week");
    QUnit.test("Should return start of week based on current date", function (assert) {
        var startOfWeek = Planung._getStartOfWeek(new Date());
        assert.ok( startOfWeek , "returned date: "+ startOfWeek);
    });

    QUnit.test("Should return start of week based on a sunday date", function (assert) {
        var startOfWeek = Planung._getStartOfWeek(new Date("2016-07-03"));
        assert.ok( startOfWeek , "returned date: "+ startOfWeek);
    });

    QUnit.test("Should return start of week based on a monday date", function (assert) {
        var startOfWeek = Planung._getStartOfWeek(new Date("2016-06-27"));
        assert.ok( startOfWeek , "returned date: "+ startOfWeek);
    });

    QUnit.module("Planung: End of week");
    QUnit.test("Should return end of week based on current date", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date());
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on sunday date with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-07-03"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on monday date with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-06-27"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 01-06-2016 with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-06-01"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 21-06-2016 with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-06-21"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 28-12-2016 with different month and year", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-12-28"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 01-01-2016 with different month and year", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-01-01"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
iach
sumber
2
var dt = new Date()  //current date of week
var currentWeekDay = dt.getDay();
var lessDays = currentWeekDay == 0 ? 6 : currentWeekDay-1
var wkStart = new Date(new Date(dt).setDate(dt.getDate()- lessDays));
var wkEnd = new Date(new Date(wkStart).setDate(wkStart.getDate()+6));

Ini akan berguna untuk skenario tanggal apa pun.

Parth Shah
sumber
1

Metode krtek ada yang salah, saya menguji ini

var startDay = 0; 
var weekStart = new Date(today.getDate() - (7 + today.getDay() - startDay) % 7);
var weekEnd = new Date(today.getDate() + (6 - today.getDay() - startDay) % 7);

berhasil

rayking
sumber
1

Meskipun pertanyaan itu tampak usang, saya harus menunjukkan sebuah masalah.
Pertanyaan: Apa yang akan terjadi pada 1 Januari 2016?
Saya pikir sebagian besar solusi di atas menghitung awal minggu sebagai 27.12.2016. Untuk alasan ini menurut saya, perhitungan yang benar harus seperti di bawah ini;

var d = new Date(),
    dayInMs = 1000 * 60 * 60 * 24,
    weekInMs = dayInMs * 7,
    startOfToday = new Date(d.getFullYear(), d.getMonth(), d.getDate()).valueOf(),
    todayElapsedTime = d.valueOf() - startOfToday,
    dayDiff = d.getDay() * dayInMs,
    dateDiff = dayDiff + todayElapsedTime, 
    // finally
    startOfWeek = d.valueOf() - dateDiff,
    endOfWeek = startOfWeek + weekInMs - 1;
efkan
sumber
0

Saran bagus tetapi Anda mendapat masalah kecil di hari terakhir. Anda harus mengubahnya menjadi:

lastday = new Date(firstday.getTime() + 60 * 60 *24 * 6 * 1000);
Adam
sumber
Tidak semua hari berlangsung selama 24 jam di mana pergeseran waktu siang hari diterapkan.
RobG
0

Pendekatan saat bekerja untuk saya untuk semua kasus (meskipun saya belum menguji batas-batas seperti akhir tahun, tahun kabisat). Hanya Koreksi pada kode di atas yang parameternya adalah "isoWeek", jika Anda ingin memulai minggu dari hari Senin.

    let startOfWeek = moment().startOf("isoWeek").toDate();
    let endOfWeek = moment().endOf("isoWeek").toDate();
pritesh agrawal
sumber
0

Hanya dengan menggunakan javascript murni, Anda dapat menggunakan fungsi di bawah ini untuk mendapatkan hari pertama dan hari terakhir dalam seminggu dengan bebas mengatur hari untuk awal minggu.

var weekday = [];
weekday[0] = "Sunday";
weekday[1] = "Monday";
weekday[2] = "Tuesday";
weekday[3] = "Wednesday";
weekday[4] = "Thursday";
weekday[5] = "Friday";
weekday[6] = "Saturday";

function getFirstDayOfWeek(date, from) {
    //Default start week from 'Sunday'. You can change it yourself.
    from = from || 'Sunday'; 
    var index = weekday.indexOf(from);
    var start = index >= 0 ? index : 0;

    var d = new Date(date);
    var day = d.getDay();
    var diff = d.getDate() - day + (start > day ? start - 7 : start);
    d.setDate(diff);
    return d;
};

Hari terakhir dalam seminggu hanya 6 hari setelah hari pertama dalam seminggu

function getLastDayOfWeek(date, from) {
    from = from || 'Sunday';
    var index = weekday.indexOf(from);
    var start = index >= 0 ? index : 0;

    var d = new Date(date);
    var day = d.getDay();
    var diff = d.getDate() - day + (start > day ? start - 1 : 6 + start);
    d.setDate(diff);
    return d;
};

Uji:

getFirstDayOfWeek('2017-10-16'); //--> Sun Oct 15 2017
getFirstDayOfWeek('2017-10-16', 'Monday'); //--> Mon Oct 16 2017
getFirstDayOfWeek('2017-10-16', 'Tuesday'); //--> Tue Oct 10 2017
pengguna3444693
sumber
0

JavaScript

function getWeekDays(curr, firstDay = 1 /* 0=Sun, 1=Mon, ... */) {
  var cd = curr.getDate() - curr.getDay();
  var from = new Date(curr.setDate(cd + firstDay));
  var to = new Date(curr.setDate(cd + 6 + firstDay));

  return {
    from,
    to,
  };
};

TypeScript

export enum WEEK_DAYS {
  Sunday = 0,
  Monday = 1,
  Tuesday = 2,
  Wednesday = 3,
  Thursday = 4,
  Friday = 5,
  Saturday = 6,
}

export const getWeekDays = (
  curr: Date,
  firstDay: WEEK_DAYS = WEEK_DAYS.Monday
): { from: Date; to: Date } => {
  const cd = curr.getDate() - curr.getDay();
  const from = new Date(curr.setDate(cd + firstDay));
  const to = new Date(curr.setDate(cd + 6 + firstDay));

  return {
    from,
    to,
  };
};
Eduardo Cuomo
sumber
0

Kami telah menambahkan kode jquery yang menunjukkan minggu hari ini dari hari senin hingga minggu.

var d = new Date();
var week = [];
var _days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
var _months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
for (let i = 1; i <= 7; i++) {
    let first = d.getDate() - d.getDay() + i; 
    let dt = new Date(d.setDate(first));
    var _day = _days[dt.getDay()];
     var _month = _months[dt.getMonth()];
     var _date = dt.getDate();
     if(_date < 10 ){
         _date = '0' +_date;
     }
     var _year = dt.getFullYear();
     var fulldate = _day+' '+_month+' '+_date+' '+_year+' ';
     week.push(fulldate);
  }
console.log(week);
Neeraj Singh
sumber
Kode ini menyimpan hari-hari kerja dalam sebuah larik bernama minggu. Format tanggal yang disimpan dalam array adalah Day Mon Date Year artinya menunjukkan hari pertama dalam seminggu, lalu bulan, tanggal dan tahun.
Neeraj Singh
Bagaimana ini "kode jQuery"? Ada banyak jawaban sederhana yang menggunakan teknik yang sama.
RobG
0

Pertanyaan lama dengan banyak jawaban, jadi pertanyaan lain tidak akan menjadi masalah. Beberapa fungsi umum untuk memulai dan mengakhiri semua jenis satuan waktu.

Untuk startOf dan endOf week, hari awal dalam seminggu ditetapkan secara default ke Sunday (0) tetapi hari apa pun bisa dilewati (Senin - 1, Selasa - 2, dll.). Hanya menggunakan kalender Gregorian.

Fungsi tidak mengubah tanggal sumber, jadi untuk melihat apakah tanggal berada di minggu yang sama dengan tanggal lainnya (minggu dimulai pada hari Senin):

if (d >= startOf('week', d1, 1) && d <= endOf('week', d1, 1)) {
  // d is in same week as d1
}

atau di minggu ini mulai hari Minggu:

if (d >= startOf('week') && d <= endOf('week')) {
  // d is in the current week
}

// Returns a new Date object set to start of given unit
// For start of week, accepts any day as start
function startOf(unit, date = new Date(), weekStartDay = 0) {
  // Copy original so don't modify it
  let d = new Date(date);
  let e = new Date(d);
  e.setHours(23,59,59,999);
  // Define methods
  let start = {
    second: d => d.setMilliseconds(0),
    minute: d => d.setSeconds(0,0),
    hour  : d => d.setMinutes(0,0,0),
    day   : d => d.setHours(0,0,0,0),
    week  : d => {
      start.day(d);
      d.setDate(d.getDate() - d.getDay() + weekStartDay);
      if (d > e) d.setDate(d.getDate() - 7);
    },
    month : d => {
      start.day(d);
      d.setDate(1);
    },
    year  : d => {
      start.day(d);
      d.setMonth(0, 1);
    },
    decade: d => {
      start.year(d);
      let year = d.getFullYear();
      d.setFullYear(year - year % 10);
    },
    century: d => {
      start.year(d);
      let year = d.getFullYear();
      d.setFullYear(year - year % 100);
    },
    millenium: d => {
      start.year(d);
      let year = d.getFullYear();
      d.setFullYear(year - year % 1000);
    }
  }
  start[unit](d);
  return d;
}

// Returns a new Date object set to end of given unit
// For end of week, accepts any day as start day
// Requires startOf
function endOf(unit, date = new Date(), weekStartDay = 0) {
  // Copy original so don't modify it
  let d = new Date(date);
  let e = new Date(date);
  e.setHours(23,59,59,999);
  // Define methods
  let end = {
    second: d => d.setMilliseconds(999),
    minute: d => d.setSeconds(59,999),
    hour  : d => d.setMinutes(59,59,999),
    day   : d => d.setHours(23,59,59,999),
    week  : w => {
      w = startOf('week', w, weekStartDay);
      w.setDate(w.getDate() + 6);
      end.day(w);
      d = w;
    },
    month : d => {
      d.setMonth(d.getMonth() + 1, 0);
      end.day(d);
    },  
    year  : d => {
      d.setMonth(11, 31);
      end.day(d);
    },
    decade: d => {
      end.year(d);
      let y = d.getFullYear();
      d.setFullYear(y - y % 10 + 9);
    },
    century: d => {
      end.year(d);
      let y = d.getFullYear();
      d.setFullYear(y - y % 100 + 99);
    },
    millenium: d => {
      end.year(d);
      let y = d.getFullYear();
      d.setFullYear(y - y % 1000 + 999);
    }
  }
  end[unit](d);
  return d;
}

// Examples
let d = new Date();

['second','minute','hour','day','week','month','year',
 'decade','century','millenium'].forEach(unit => {
   console.log(('Start of ' + unit).padEnd(18)  + ': ' +
   startOf(unit, d).toString());
   console.log(('End of ' + unit).padEnd(18)  + ': ' +
   endOf(unit, d).toString());
});

RobG
sumber
0

Perubahan kecil untuk jawaban @Chris Lang. Jika Anda ingin hari Senin sebagai hari pertama gunakan ini.

Date.prototype.GetFirstDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay()+ (this.getDay() == 0 ? -6:1) )));
}
Date.prototype.GetLastDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay() +7)));
}

var today = new Date();

alert(today.GetFirstDayOfWeek());

alert(today.GetLastDayOfWeek());

Thaks @rislang

SHIVA
sumber
0

function getMonday(d) {
    d = new Date(d);
    var day = d.getDay(),
        diff = d.getDate() - day + (day == 0 ? -6:1); // adjust when day is sunday
    return new Date(d.setDate(diff));
  }
  
 console.log( getMonday(new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate())) )  // Mon Nov 08 2010

ghiles ybeggazene
sumber