JavaScript - haftanın ilk gününü geçerli tarihten itibaren alın


162

Haftanın ilk gününü almanın en hızlı yoluna ihtiyacım var. Örneğin: bugün 11 Kasım ve Perşembe; 8 Kasım olan bu haftanın ilk gününü ve Pazartesi gününü istiyorum. MongoDB harita fonksiyonu için en hızlı yönteme ihtiyacım var, herhangi bir fikir?


Her küçük hız çok önemliyse, cevabımı test etmek isteyebilirsiniz. Tarayıcılarda benimki ile biraz daha iyi bir performans elde ediyorum (CMS'yi destekleyen IE hariç). Tabii ki, MongoDB ile test etmeniz gerekir. İşlev Pazartesi olan bir tarihi geçtiğinde, değiştirilmemiş orijinal tarihi döndürdüğü için daha da hızlı olmalıdır.
user113716

Ben de aynı sorunu var ve javascript tarih nesnesi ben şimdi datejs.com (burada code.google.com/p/datejs ), yerel tarihin özledim davranışını düzelten bir kütüphane kullanıyorum hata bir sürü olduğundan .
lolol

Soru başlığı haftanın ilk gününü, soru açıklaması ise son Pazartesi gününü ister. Bunlar aslında iki farklı soru. İkisini de doğru bir şekilde çözen cevabımı kontrol et.
Louis Ameline

Yanıtlar:


323

getDayDate nesneleri yöntemini kullanarak, haftanın gün sayısını öğrenebilirsiniz (0 = Pazar, 1 = Pazartesi, vb.).

Daha sonra bu gün sayısını artı bir tane çıkarabilirsiniz, örneğin:

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

getMonday(new Date()); // Mon Nov 08 2010

3
Bu işlevin bir hatası var mı? - Söz konusu tarihle Perşembe ise 2 gün = 4, fark = 2-4 = -1 + 1 ve setDate sonucu (bkz 'önceki ayın son günü önceki gün' olacak bu ).
Izhaki

2
@Izhaki ne demek istiyorsun? 2 Mayıs için bu işlev 29 Nisan'ı döndürür ve bu doğrudur.
meze

14
Pazar haftanın ilk günü ise, şunu kullanın:diff = d.getDate() - day;
cfree

2
@SMS kodu için teşekkürler. Haftanın ilk gününün tam olarak 0 saatini almak için küçük bir değişiklik yaptım. d.setHours(0); d.setMinutes(0); d.setSeconds(0);
Awi

3
bu arada, d.setDate değiştirilebilir, "d" kendisini değiştirir
Ayyash

53

Performans için nasıl karşılaştırıldığından emin değilim, ama bu işe yarıyor.

var today = new Date();
var day = today.getDay() || 7; // Get current day number, converting Sun. to 7
if( day !== 1 )                // Only manipulate the date if it isn't Mon.
    today.setHours(-24 * (day - 1));   // Set the hours to day number minus 1
                                         //   multiplied by negative 24
alert(today); // will be Monday

Veya bir işlev olarak:

# modifies _date_
function setToMonday( date ) {
    var day = date.getDay() || 7;  
    if( day !== 1 ) 
        date.setHours(-24 * (day - 1)); 
    return date;
}

setToMonday(new Date());

4
Bu cevap olmalıydı, soruyu cevaplayan tek cevap bu olurdu. Diğerleri buggy veya sizi üçüncü taraf kütüphanelerine yönlendiriyor.
OverMars

Soğuk benim için çalışıyor! Bazı ayarlamalar yaparak belirli bir tarihten haftanın hem pazartesi hem de cuma günleri olsun!
alexventuraio

10
Bu harika, ancak bu fonksiyonun geçtiği tarih nesnesini değiştirdiği için "setToMonday" olarak adlandırılması gerekir. GetMonday, geçen tarihe göre pazartesi olan yeni bir Tarih döndürür. İnce bir fark, ancak kullandıktan sonra beni yakalayan bir tarih bu işlev. En kolay düzeltme date = new Date(date);getMonday işlevinde ilk satır olarak koymaktır.
Shane,

Bu harika. Bir getSunday yöntemi daha da kolay! Çok teşekkürler!
JesusIsMyDriver.dll

4
Bu cevap yanlıştır, çünkü gündüz tasarrufları nedeniyle tüm günlerin 24 saati yoktur. Tarihinizin saatini beklenmedik şekilde değiştirebilir veya hatta belirli günlerde yanlış günü döndürebilir.
Louis Ameline

13

Date.js'ye göz atın

Date.today().previous().monday()

1
ya da belkiDate.parse('last monday');
Anurag

MongoDB veritabanı için ihtiyacım var. Date.js'ye başvuramıyorum, ancak kod snippet'iniz için teşekkür ederim.
INs

1
Ah, JS'yi doğrudan MongoDB'de uygulayabileceğinin farkında değildim. Oldukça kaygan. Sorgu verilerini hazırlamak için JS'yi kullandığınız varsayılmıştı.
Matt

JQuery gibi, basit bir işleve erişmek için tüm kitaplığı (ne kadar küçük olursa olsun) aşağı çekmekle ilgilenmiyor.
Muffin Adam

İyi bir çözüm değil, çünkü ülkeler var, haftanın ilk günü pazar.
Stefan Brendle

11

CMS'nin yanıtı doğru ancak Pazartesi gününün haftanın ilk günü olduğunu varsayar.
Chandler Zwolle'un cevabı doğrudur ancak Date prototipiyle uğraşır.
Saat / dakika / saniye / milisaniye ile oynayan diğer cevaplar yanlıştır.

Aşağıdaki işlev doğrudur ve ilk parametre olarak bir tarih ve ikinci parametre olarak istenen haftanın ilk günü alır (Pazar için 0, Pazartesi için 1, vb.). Not: saat, dakika ve saniye, gün başlangıcı için 0 olarak ayarlanmıştır.

function firstDayOfWeek(dateObject, firstDayOfWeekIndex) {

    const dayOfWeek = dateObject.getDay(),
        firstDayOfWeek = new Date(dateObject),
        diff = dayOfWeek >= firstDayOfWeekIndex ?
            dayOfWeek - firstDayOfWeekIndex :
            6 - dayOfWeek

    firstDayOfWeek.setDate(dateObject.getDate() - diff)
    firstDayOfWeek.setHours(0,0,0,0)

    return firstDayOfWeek
}

// August 18th was a Saturday
let lastMonday = firstDayOfWeek(new Date('August 18, 2018 03:24:00'), 1)

// outputs something like "Mon Aug 13 2018 00:00:00 GMT+0200"
// (may vary according to your time zone)
document.write(lastMonday)


8
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 iyi işleyecek.


4

Bunu kullanıyorum

function get_next_week_start() {
   var now = new Date();
   var next_week_start = new Date(now.getFullYear(), now.getMonth(), now.getDate()+(8 - now.getDay()));
   return next_week_start;
}

3

Bu işlev, geçerli haftayı çıkarmak için geçerli milisaniye süresini kullanır ve geçerli tarih pazartesi günü ise bir hafta daha çıkarır (javascript pazardan sayar).

function getMonday(fromDate) {
    // length of one day i milliseconds
  var dayLength = 24 * 60 * 60 * 1000;

  // Get the current date (without time)
    var currentDate = new Date(fromDate.getFullYear(), fromDate.getMonth(), fromDate.getDate());

  // Get the current date's millisecond for this week
  var currentWeekDayMillisecond = ((currentDate.getDay()) * dayLength);

  // subtract the current date with the current date's millisecond for this week
  var monday = new Date(currentDate.getTime() - currentWeekDayMillisecond + dayLength);

  if (monday > currentDate) {
    // It is sunday, so we need to go back further
    monday = new Date(monday.getTime() - (dayLength * 7));
  }

  return monday;
}

Hafta bir aydan diğerine (ve yıllara) yayıldığında test ettim ve düzgün çalışıyor gibi görünüyor.


3

İyi akşamlar,

Ben sadece basit bir uzantı yöntemi var tercih ederim:

Date.prototype.startOfWeek = function (pStartOfWeek) {
    var mDifference = this.getDay() - pStartOfWeek;

    if (mDifference < 0) {
        mDifference += 7;
    }

    return new Date(this.addDays(mDifference * -1));
}

Bunun aslında kullandığım başka bir uzantı yöntemini kullandığını göreceksiniz:

Date.prototype.addDays = function (pDays) {
    var mDate = new Date(this.valueOf());
    mDate.setDate(mDate.getDate() + pDays);
    return mDate;
};

Şimdi, haftalarınız Pazar günü başlıyorsa, pStartOfWeek parametresi için "0" değerini girin, şöyle:

var mThisSunday = new Date().startOfWeek(0);

Benzer şekilde, haftalarınız Pazartesi günü başlıyorsa, pStartOfWeek parametresi için bir "1" iletin:

var mThisMonday = new Date().startOfWeek(1);

Saygılarımızla,


2

Haftanın ilk günü

Bugünden itibaren haftanın ilk gününün tarihini almak için şöyle bir şey kullanabilirsiniz:

function getUpcomingSunday() {
  const date = new Date();
  const today = date.getDate();
  const dayOfTheWeek = date.getDay();
  const newDate = date.setDate(today - dayOfTheWeek + 7);
  return new Date(newDate);
}

console.log(getUpcomingSunday());

Ya da haftanın son gününü bugünden almak için:

function getLastSunday() {
  const date = new Date();
  const today = date.getDate();
  const dayOfTheWeek = date.getDay();
  const newDate = date.setDate(today - (dayOfTheWeek || 7));
  return new Date(newDate);
}

console.log(getLastSunday());

* Saat diliminize bağlı olarak, haftanın başlangıcı Pazar günü başlamak zorunda değildir, Cuma, Cumartesi, Pazartesi veya makinenizin ayarlandığı başka bir günde başlayabilir. Bu yöntemler bunu açıklayacaktır.

* Şöyle toISOStringyöntem kullanarak da biçimlendirebilirsiniz :getLastSunday().toISOString()


1

setDate () yöntemi, yukarıdaki açıklamalarda belirtilen ay sınırları ile ilgili sorunlara sahiptir. Temiz bir çözüm, Date nesnesindeki (şaşırtıcı derecede sezgisel) yöntemler yerine dönem zaman damgalarını kullanarak tarih farkını bulmaktır. yani

function getPreviousMonday(fromDate) {
    var dayMillisecs = 24 * 60 * 60 * 1000;

    // Get Date object truncated to date.
    var d = new Date(new Date(fromDate || Date()).toISOString().slice(0, 10));

    // If today is Sunday (day 0) subtract an extra 7 days.
    var dayDiff = d.getDay() === 0 ? 7 : 0;

    // Get date diff in millisecs to avoid setDate() bugs with month boundaries.
    var mondayMillisecs = d.getTime() - (d.getDay() + dayDiff) * dayMillisecs;

    // Return date as YYYY-MM-DD string.
    return new Date(mondayMillisecs).toISOString().slice(0, 10);
}

1

İşte benim çözümüm:

function getWeekDates(){
    var day_milliseconds = 24*60*60*1000;
    var dates = [];
    var current_date = new Date();
    var monday = new Date(current_date.getTime()-(current_date.getDay()-1)*day_milliseconds);
    var sunday = new Date(monday.getTime()+6*day_milliseconds);
    dates.push(monday);
    for(var i = 1; i < 6; i++){
        dates.push(new Date(monday.getTime()+i*day_milliseconds));
    }
    dates.push(sunday);
    return dates;
}

Artık döndürülen dizi dizinine göre tarih seçebilirsiniz.


0

Herhangi bir Dateişlevi olmayan sadece matematiksel hesaplamaya bir örnek .

const date = new Date();
const ts = +date;

const mondayTS = ts - ts % (60 * 60 * 24 * (7-4) * 1000);

const monday = new Date(mondayTS);
console.log(monday.toISOString(), 'Day:', monday.getDay());

const formatTS = v => new Date(v).toISOString();
const adjust = (v, d = 1) => v - v % (d * 1000);

const d = new Date('2020-04-22T21:48:17.468Z');
const ts = +d; // 1587592097468

const test = v => console.log(formatTS(adjust(ts, v)));

test();                     // 2020-04-22T21:48:17.000Z
test(60);                   // 2020-04-22T21:48:00.000Z
test(60 * 60);              // 2020-04-22T21:00:00.000Z
test(60 * 60 * 24);         // 2020-04-22T00:00:00.000Z
test(60 * 60 * 24 * (7-4)); // 2020-04-20T00:00:00.000Z, monday

// So, what does `(7-4)` mean?
// 7 - days number in the week
// 4 - shifting for the weekday number of the first second of the 1970 year, the first time stamp second.
//     new Date(0)          ---> 1970-01-01T00:00:00.000Z
//     new Date(0).getDay() ---> 4


0

bunun daha genelleştirilmiş bir sürümü ... bu, belirttiğiniz güne göre geçerli haftanın herhangi bir gününü verecektir.

//returns the relative day in the week 0 = Sunday, 1 = Monday ... 6 = Saturday
function getRelativeDayInWeek(d,dy) {
  d = new Date(d);
  var day = d.getDay(),
      diff = d.getDate() - day + (day == 0 ? -6:dy); // adjust when day is sunday
  return new Date(d.setDate(diff));
}

var monday = getRelativeDayInWeek(new Date(),1);
var friday = getRelativeDayInWeek(new Date(),5);

console.log(monday);
console.log(friday);


-1

Kontrol et: moment.js

Misal:

moment().day(-7); // last Sunday (0 - 7)
moment().day(7); // next Sunday (0 + 7)
moment().day(10); // next Wednesday (3 + 7)
moment().day(24); // 3 Wednesdays from now (3 + 7 + 7 + 7)

Bonus: node.js ile de çalışır


18
Bu OP'nin sorusuna bir cevap değil. Bir tarihi var, örneğin 08/07/14 (g / a / y). Bu haftanın ilk gününü almak istiyor (benim yerim için bu geçen Pazartesi ya da dün olurdu) Şu anki sorusuna bir cevap olurdumoment().startOf('week')
Jeroen Pelgrims

moment().startOf("week")Yerel ayarlara bağlı olarak, önceki Pazar gününün tarihini verebileceğini unutmayın . Bu durumda, moment().startOf('isoWeek')bunun yerine kullanın: runkit.com/embed/wdpi4bjwh6rt
Harm te Molder

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.