JavaScript'te haftanın ilk ve son günü nasıl alınır?


97

Nesnem var today = new Date();. Bu haftanın ilk ve son gününe ihtiyacım var. Haftanın başlangıç ​​ve bitiş günü olarak Pazar ve Pazartesi için her iki türe de ihtiyacım var. Şimdi bir kodla biraz kafam karıştı. Bana yardım edebilir misin?

Yanıtlar:


197
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"

Bu, ilk gün için çalışır = bu haftanın pazar günü ve son gün = bu hafta için cumartesi. Pazartesiden pazara kadar uzatmak önemsizdir.

Farklı aylarda ilk ve son günlerde çalışmasını sağlamak kullanıcıya bir egzersiz olarak bırakılmıştır.


teşekkürler, bunu nasıl yapabilirim ama ilk gün pazartesi ne zaman?
JuanPablo

4
var first = curr.getDate() - curr.getDay() +1;
JuanPablo

41
Farklı aylarınız olduğunda çalışmasını sağlamak için -var lastday = new Date(curr.setDate(first.getDate()+6)).toUTCString();
Richard N

2
Şubat dahil her ay çalışmasını sağlamak için yukarıdaki koddan ilk günden önceki son günün satırını koyun ve tüm aylar boyunca çalışacaktır.
Tareq

2
@Rayons cevabına benzer bir kod, ancak bu diğer aylar ve yıllar için bile işe yarayacak, 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(); sadece küçük bir hata yapan @ RichardN'nin kodunu düzelttim
Azeez

65

Kabul edilen cevaba dikkat edin, saati 00:00:00 ve 23:59:59 olarak ayarlamaz, böylece sorun yaşayabilirsiniz.

Tarihlerle ilgilenmek için üçüncü taraf bir tarih kitaplığı kullanabilirsiniz. Örneğin:

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

DÜZENLEME: Eylül 2020 itibarıyla, yeni projeler için Moment kullanımı önerilmemektedir ( blog gönderisi )

Bir diğer popüler alternatif ise tarih-fns'dir .


21
Eğer anı kullanırsanız "hafta" yerine "isoweek" kullanın, aksi takdirde hafta pazardan başlayacak ve cumartesi ile sona erecektir var startOfWeek = moment().startOf('isoweek').toDate(); var endOfWeek = moment().endOf('isoweek').toDate();
Brugolo

Teşekkürler arkadaşlar zamanımı kurtardınız :-)
Syed Ehtsham Abbas

1
Moment.js kullanmadan zamanı hesaba katmak için Date.setHours kullanın: curr.setHours (0,0,0,0); lastday.setHours (23,59,59,59);
matadur

'isoWeek' olmalı, 'isoweek' değil
Mayur Saner

Aşk anı js, piyasadaki en iyi tarih / saat kitaplarından biri!
Vippy

50

Haftanın ilk ve son tarihini öğrenmek için aşağıdaki kod satırlarını da kullanabilirsiniz:

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

Umarım faydalı olur ..


2
Evet, Ama @totymedii, Raynos cevabı 1 Mart 2019 için yanlış, kanıtım var, ilk gün :: Paz, 24 Şubat 2019 08:33:48 GMT son gün :: Cmt, 02 Şubat 2019 08:33:48 GMT
Deepak Patel

14

İşte herhangi bir başlangıç ​​günü için ilk ve son güne ulaşmanın hızlı bir yolu. bilerek:

1 gün = 86.400.000 milisaniye.

JS tarih değerleri milisaniye cinsindendir

Tarif: Haftanızın başlangıç ​​gününü öğrenmek için kaç günü kaldırmanız gerektiğini belirleyin (1 günlük milisaniye ile çarpın). Bundan sonra kalan tek şey, bitiş gününüzü almak için 6 gün eklemektir.

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

3
Bu işe yaramıyor çünkü DST sayesinde günler her zaman 86.400.000 milisaniye uzunluğunda değil ...
ValarDohaeris

11

Mükemmel (ve değişmez) tarih-fns kitaplığı bunu en kısaca ele alır:

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

Haftanın varsayılan başlangıç ​​günü Pazar'dır (0), ancak şu şekilde Pazartesi (1) olarak değiştirilebilir:

const start = startOfWeek(date, {weekStartsOn: 1});
const end = endOfWeek(date, {weekStartsOn: 1});

1
artı 1 anı değil tarih-fns kullanmak için
CENT1PEDE

@RobG Kullandığınız herhangi bir yöntemin varsayılan bir haftanın ilk günü olacaktır.
Freewalker

3

Bunun gibi bir şey yapabilirsin

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

Nerede startDay0 ile 6 arasında bir sayıdır Pazar 0 standları (vs yani 1 = Pazartesi, 2 = Salı,).


3

SetDateayın gününü ayarlar. Kullanılması setDatebaşlangıç ve ay sonuna sırasında, yanlış hafta sonuçlanacak

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

Tarih'i 01 Temmuz 2014 olarak ayarlarsanız, ilk günü 05 Temmuz 2014 yerine 29 Haziran 2014 ve son günü 05 Haziran 2014 olarak gösterir.

Öyleyse kullandığım bu sorunun üstesinden gel

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

" Başlangıç ve ay sonuna sırasında SetDate kullanarak, yanlış hafta sonuçlanacak doğru kullanılırsa değil".
RobG

3

Bu, yıl ve ay değişikliklerinde işe yarar.

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

Şimdi bu gereksiz görünüyor. smh
Chris Lang

Ve haftalar için Pazartesi başlıyor?
RobG

@RobG bakınız bu
SHIVA

2

Bu tür durumlar için Moment.js kullanmanızı tavsiye ederim. Geçerli tarih saatini, bu hafta, bu ay ve bu çeyrek tarih saatini kontrol etmem gereken senaryolar vardı. Yukarıdaki bir yanıt bana yardımcı oldu, bu yüzden diğer işlevleri de paylaşmayı düşündüm.

Yalnızca geçerli tarih saatini belirli bir biçimde almak için

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

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

Eğer endOf işlevi için parametre olarak 'week' kullanırsak, ancak Pazar gününü haftanın sonu olarak almak için 'isoweek' kullanmamız gerekir.

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

Bu formatı ihtiyacıma göre seçtim. Formatı ihtiyacınıza göre değiştirebilirsiniz.


Moment.js artık eski bir proje ve daha fazla önemli güncelleme almayacak: 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()) ));
    }, 

* güncel tarih == 30.06.2016 ve pazartesi haftanın ilk günüdür.

Aynı zamanda farklı aylar ve yıllar için de çalışır. Qunit Suite ile test edildi:

görüntü açıklamasını buraya girin

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

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

Bu, herhangi bir tarih senaryosu için faydalı olacaktır.


1

krtek'in yönteminde bazı yanlışlar var, bunu test ettim

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

işe yarıyor


1

Soru modası geçmiş gibi görünse de, bir soruna dikkat çekmek zorundayım.
Soru: 1 Ocak 2016'da ne olacak?
Yukarıdaki çözümlerin çoğunun hafta başlangıcını 27.12.2016 olarak hesapladığını düşünüyorum. Bu nedenle doğru hesaplamanın basitçe aşağıdaki gibi olması gerektiğini düşünüyorum;

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;

0

Güzel öneri ama geçen gün küçük bir sorunun var. Bunu şu şekilde değiştirmelisiniz:

lastday = new Date(firstday.getTime() + 60 * 60 *24 * 6 * 1000);

Yaz saati uygulamasının gözlemlendiği tüm günler 24 saat uzunluğunda değildir.
RobG

0

An yaklaşımı benim için tüm durumlarda işe yaradı (yıl sonu, artık yıllar gibi sınırları test etmemiş olmama rağmen). Haftaya Pazartesi gününden başlamak istiyorsanız, yukarıdaki kodda yalnızca Düzeltme "isoWeek" parametresidir.

    let startOfWeek = moment().startOf("isoWeek").toDate();
    let endOfWeek = moment().endOf("isoWeek").toDate();

0

Sadece saf javascript kullanarak, haftanın başlangıcı için serbestçe ayarlanan haftanın ilk gününü ve son gününü elde etmek için aşağıdaki işlevi kullanabilirsiniz.

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

Haftanın son günü, haftanın ilk gününden sadece 6 gün sonra

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

Ölçek:

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

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

0

Pazartesiden pazara günlerin mevcut haftasını gösteren jquery kodunu ekledik.

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

Bu kod, hafta olarak adlandırılan bir dizide haftanın günlerini depolar. Gün Pzt Tarih Yıl dizide saklanan tarih formatı haftanın ilk gününü, ardından ayı, tarihi ve yılı gösterdiği anlamına gelir.
Neeraj Singh

Bu "jQuery kodu" nasıl? Aynı tekniği kullanan çok sayıda basit cevap vardır.
RobG

0

Çok sayıda yanıtı olan eski bir soru, bu nedenle başka bir soru sorun olmayacak. Her tür zaman biriminin başlangıcını ve sonunu elde etmek için bazı genel işlevler.

İçin startOf ve endOf hafta Pazar (0) ancak herhangi bir gün hafta varsayılan başlangıç günü (- 1, Salı - 2, vb Pazartesi) geçirilebilir. Yine de yalnızca Gregoryen takvimini kullanır.

İşlevler kaynak tarihini değiştirmez, bu nedenle bir tarihin başka bir tarihle aynı hafta içinde olup olmadığını görmek için (hafta Pazartesi'den başlar):

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

veya Pazar günü başlayan mevcut hafta:

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


0

@Chris Lang yanıtında küçük değişiklik. Pazartesinin ilk gün olmasını istiyorsanız bunu kullanın.

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

@Hayalhanemersin


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


0

var currentDate = new Date();
var firstday = new Date(currentDate.setDate(currentDate.getDate() - currentDate.getDay())).toUTCString();
var lastday = new Date(currentDate.setDate(currentDate.getDate() - currentDate.getDay() + 7)).toUTCString();
console.log(firstday, lastday)

Aşağıdaki kodu içinde kullanıyorum, ancak .toUTCString () nedeniyle, resimde gösterildiği gibi aşağıdaki hatayı alıyorum.

.toUTCString () kaldırırsam. aldığım çıktı beklendiği gibi değil

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.