JavaScript - pobierz pierwszy dzień tygodnia od aktualnej daty
161
Potrzebuję najszybszego sposobu na pierwszy dzień tygodnia. Na przykład: dzisiaj jest 11 listopada i czwartek; i chcę pierwszy dzień tego tygodnia, czyli 8 listopada, i poniedziałek. Potrzebuję najszybszej metody dla funkcji mapy MongoDB, jakieś pomysły?
Jeśli każda odrobina szybkości jest kluczowa, możesz przetestować moją odpowiedź. Mam trochę lepszą wydajność z moją w przeglądarkach (z wyjątkiem IE, który faworyzuje CMS). Oczywiście musiałbyś to przetestować w MongoDB. Gdy funkcja przekroczy datę, która jest poniedziałek, powinno to być jeszcze szybsze, ponieważ po prostu zwraca niezmodyfikowaną pierwotną datę.
Mam ten sam problem, a ponieważ obiekt daty javascript ma wiele błędów, używam teraz datejs.com (tutaj code.google.com/p/datejs ), biblioteki, która koryguje zachowanie braku natywnej daty.
Tytuł pytania dotyczy pierwszego dnia tygodnia, a opis pytania dotyczy ostatniego poniedziałku. W rzeczywistości są to dwa różne pytania. Sprawdź moją odpowiedź, która rozwiązuje oba w prawidłowy sposób.
Korzystając z getDaymetody obiektów Date, możesz poznać numer dnia tygodnia (0 = niedziela, 1 = poniedziałek itd.).
Następnie możesz odjąć tę liczbę dni plus jeden, na przykład:
function getMonday(d){
d =newDate(d);var day = d.getDay(),
diff = d.getDate()- day +(day ==0?-6:1);// adjust when day is sundayreturnnewDate(d.setDate(diff));}
getMonday(newDate());// Mon Nov 08 2010
Czy ta funkcja ma błąd? - jeśli daną datą jest drugi czwartek, dzień = 4, diff = 2 - 4 + 1 = -1, a wynikiem setDate będzie „dzień przed ostatnim dniem poprzedniego miesiąca” (zobacz to ).
Nie jestem pewien, jak wypada na tle wydajności, ale to działa.
var today =newDate();var day = today.getDay()||7;// Get current day number, converting Sun. to 7if( 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:
# modifies _date_
function setToMonday( date ){var day = date.getDay()||7;if( day !==1)
date.setHours(-24*(day -1));return date;}
setToMonday(newDate());
Jest to świetne, z wyjątkiem tego, że ta funkcja powinna nazywać się „setToMonday”, ponieważ modyfikuje przekazany obiekt daty. GetMonday zwróci nową datę, czyli poniedziałek na podstawie przekazanej daty. Subtelna różnica, ale taka, która mnie złapała po użyciu ta funkcja. Najłatwiejszym rozwiązaniem jest umieszczenie date = new Date(date);jako pierwszej linii w funkcji getMonday.
Ta odpowiedź jest błędna, ponieważ nie wszystkie dni mają 24 godziny ze względu na oszczędności w ciągu dnia. Może albo nieoczekiwanie zmienić godzinę twojej randki, albo nawet zwrócić zły dzień w niektórych przypadkach.
Odpowiedź CMS jest prawidłowa, ale zakłada, że poniedziałek jest pierwszym dniem tygodnia.
Odpowiedź Chandlera Zwolle jest poprawna, ale bawi się prototypem Date.
Inne odpowiedzi, które grają z godzinami / minutami / sekundami / milisekundami, są błędne.
Poniższa funkcja jest poprawna i przyjmuje datę jako pierwszy parametr i żądany pierwszy dzień tygodnia jako drugi parametr (0 dla niedzieli, 1 dla poniedziałku itd.). Uwaga: godzina, minuty i sekundy są ustawione na 0, aby rozpocząć dzień.
function firstDayOfWeek(dateObject, firstDayOfWeekIndex){const dayOfWeek = dateObject.getDay(),
firstDayOfWeek =newDate(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 Saturdaylet lastMonday = firstDayOfWeek(newDate('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)
function get_next_week_start(){var now =newDate();var next_week_start =newDate(now.getFullYear(), now.getMonth(), now.getDate()+(8- now.getDay()));return next_week_start;}
Ta funkcja wykorzystuje bieżący czas milisekund do odejmowania bieżącego tygodnia, a następnie odejmuje jeden tydzień więcej, jeśli bieżąca data wypada w poniedziałek (w języku JavaScript liczy się od niedzieli).
function getMonday(fromDate){// length of one day i millisecondsvar dayLength =24*60*60*1000;// Get the current date (without time)var currentDate =newDate(fromDate.getFullYear(), fromDate.getMonth(), fromDate.getDate());// Get the current date's millisecond for this weekvar currentWeekDayMillisecond =((currentDate.getDay())* dayLength);// subtract the current date with the current date's millisecond for this weekvar monday =newDate(currentDate.getTime()- currentWeekDayMillisecond + dayLength);if(monday > currentDate){// It is sunday, so we need to go back further
monday =newDate(monday.getTime()-(dayLength *7));}return monday;}
Przetestowałem to, gdy tydzień trwa od miesiąca do miesiąca (a także lat) i wydaje się, że działa prawidłowo.
* W zależności od strefy czasowej początek tygodnia nie musi zaczynać się w niedzielę, może zaczynać się w piątek, sobotę, poniedziałek lub w inny dzień, na który urządzenie jest ustawione. Te metody to wyjaśnią.
* Możesz również sformatować go za pomocą następującej toISOStringmetody:getLastSunday().toISOString()
setDate () ma problemy z granicami miesiąca, które opisano w komentarzach powyżej. Prostym obejściem jest znalezienie różnicy dat przy użyciu datowników epok, a nie (zaskakująco sprzecznych z intuicją) metod w obiekcie Date. To znaczy
function getPreviousMonday(fromDate){var dayMillisecs =24*60*60*1000;// Get Date object truncated to date.var d =newDate(newDate(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.returnnewDate(mondayMillisecs).toISOString().slice(0,10);}
const formatTS = v =>newDate(v).toISOString();const adjust =(v, d =1)=> v - v %(d *1000);const d =newDate('2020-04-22T21:48:17.468Z');const ts =+d;// 1587592097468const 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
bardziej uogólniona wersja tego ... da ci to dowolny dzień w bieżącym tygodniu na podstawie tego, który dzień podasz.
//returns the relative day in the week 0 = Sunday, 1 = Monday ... 6 = Saturdayfunction getRelativeDayInWeek(d,dy){
d =newDate(d);var day = d.getDay(),
diff = d.getDate()- day +(day ==0?-6:dy);// adjust when day is sundayreturnnewDate(d.setDate(diff));}var monday = getRelativeDayInWeek(newDate(),1);var friday = getRelativeDayInWeek(newDate(),5);
console.log(monday);
console.log(friday);
Nie jest to jednak odpowiedź na pytanie OP. Ma datę, powiedzmy 08/07/14 (d / m / r). Chce dostać pierwszy dzień tego tygodnia (dla mojego regionu byłby to właśnie miniony poniedziałek lub wczoraj). Odpowiedź na jego pytanie byłaby z chwiląmoment().startOf('week')
Należy pamiętać, moment().startOf("week")że w zależności od ustawień regionalnych może podać datę poprzedniej niedzieli. W takim przypadku użyj moment().startOf('isoWeek')zamiast tego: runkit.com/embed/wdpi4bjwh6rt
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.