2010-11-11 20 views
86

Potrzebuję najszybszego sposobu na zdobycie pierwszego dnia tygodnia. Na przykład dzisiaj jest 11 listopada i czwartek, muszę przekonwertować tę datę na 8 listopada (poniedziałek). Potrzebuję najszybszej metody dla funkcji mapy MongoDB, jakichkolwiek pomysłów?JavaScript - pierwszy dzień tygodnia od bieżącej daty

+0

Jeśli każda najmniejsza szybkość ma kluczowe znaczenie, może warto przetestować moją odpowiedź. Dostaję trochę lepszą wydajność z moimi w przeglądarkach (z wyjątkiem IE, co sprzyja CMS). Oczywiście, musisz przetestować go z MongoDB. Gdy funkcja zostanie przyjęta jako poniedziałek, powinna być jeszcze szybsza, ponieważ po prostu zwraca niezmienioną oryginalną datę. – user113716

+0

Mam ten sam problem i ponieważ obiekt daty javascript ma wiele błędów, których używam teraz http://www.datejs.com (tutaj http://code.google.com/p/datejs/), biblioteka które korygują brakujące zachowanie macierzystej daty. – lolol

Odpowiedz

185

Stosując metodę nieaktualne obiektów getDay można poznać numer dnia tygodnia (jest 0 = niedziela, 1 = poniedziałek, etc).

można następnie odjąć tę liczbę dni plus jeden, na przykład:

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 
+2

Dziękuję, ładny przykład – INs

+3

Czy ta funkcja ma błąd? - jeżeli daną datą jest czwartek, 2 dzień, dzień = 4, diff = 2 - 4 + 1 = -1, a wynikiem setDate będzie "dzień przed ostatnim dniem poprzedniego miesiąca" (patrz [to] (http://www.w3schools.com/jsref/jsref_setdate.asp)). – Izhaki

+0

@ Izhaki co masz na myśli? Dla 2 maja funkcja zwraca 29 kwietnia, co jest poprawne. – meze

13

Wyjazd Date.js

Date.today().previous().monday() 
+0

lub może "Date.parse (" ostatni poniedziałek ");' – Anurag

+0

Potrzebuję go do bazy danych MongoDB. Nie mogę więc odwoływać się do date.js, ale dziękuję za fragment kodu. – INs

+1

Ah, nie wiedziałem, że możesz wykonać JS bezpośrednio w MongoDB. To całkiem sprytne. Zakładałem, że używasz JS do przygotowania danych zapytania. – Matt

37

Nie wiem jak to porównać do wykonania, ale to działa.

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 

lub jako funkcja:

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

getMonday(new Date()); 
+4

To powinna być odpowiedź, jako jedyna, która odpowiada na zadane pytanie. Pozostałe są błędne lub odsyłają do bibliotek stron trzecich. – OverMars

+0

Cool to działa dla mnie! Dokonując pewnych korekt, fajnie dostaję zarówno poniedziałek, jak i piątek tygodnia od podanej daty! –

+4

To jest świetne, z tą różnicą, że ta funkcja powinna być nazywana "setToMonday", ponieważ modyfikuje obiekt daty przekazany. GetMonday, zwróci nową datę, która jest poniedziałkiem na podstawie daty przekazanej. Subtelna różnica, ale która mnie złapała po używając tej funkcji. Najprostszą poprawką jest umieszczenie 'date = new Date (date);' jako pierwszej linii w funkcji getMonday. – Shane

2

Check out: moment.js

Przykład:

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: współpracuje z node.js zbyt

+16

To jednak nie jest odpowiedź na pytanie OP. Ma datę, powiedzmy 08/07/14 (d/m/r). On chce dostać pierwszy dzień tego tygodnia (dla mojego lokalu byłby to poniedziałek, który właśnie minął lub wczoraj) Odpowiedź na swoje pytanie z momentem brzmi: "moment(). StartOf (" tydzień ") –

3

Używam tego

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

Ta funkcja wykorzystuje aktualny czas milisekundy odjąć bieżącego tygodnia, a następnie odejmuje jeszcze jeden tydzień, jeśli bieżąca data jest na poniedziałek (javascript liczy się od niedzieli).

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

Testowałem to, gdy tydzień rozciąga się z jednego miesiąca na drugi (a także lata), i wydaje się, że działa prawidłowo.

1

setDate() ma problemy z granicami miesiąca, które są odnotowane w komentarzach powyżej. Oczywistym rozwiązaniem jest znalezienie różnicy dat za pomocą znaczników czasu epoki, a nie (zaskakująco sprzecznych z intuicją) metod na obiekcie Date. To znaczy.

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

Dobry wieczór,

Wolę po prostu prostą metodę rozszerzenia:

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

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

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

Zauważysz to rzeczywiście wykorzystuje inną metodę rozszerzenia, które używam:

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

Teraz, jeśli twoje tygodnie rozpoczynają się w niedzielę, podaj "0" dla parametru pStartOfWeek, na przykład:

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

Podobnie, jeśli tydzień rozpocznie się w poniedziałek, przechodzą na "1" dla parametru pStartOfWeek:

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

Pozdrowienia,

0

Oto moje rozwiązanie:

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

Teraz możesz wybrać datę przez zwrócony indeks tablicy.

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

To zadziała dobrze.

Powiązane problemy