Mam today = new Date();
przedmiot. Chcę dostać pierwszy i ostatni dzień bieżącego tygodnia. Potrzebuję obu wariantów na niedzielę i poniedziałek jako dzień rozpoczęcia i zakończenia tygodnia. Jestem teraz trochę zdezorientowany z kodem. Czy możesz mi pomóc?
javascript
date
Petya Petrov
źródło
źródło
var first = curr.getDate() - curr.getDay() +1;
var lastday = new Date(curr.setDate(first.getDate()+6)).toUTCString();
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();
po prostu poprawiłem kod @ RichardN, który ma mały błądUważaj na zaakceptowaną odpowiedź, nie ustawia czasu na 00:00:00 i 23:59:59, więc możesz mieć problemy.
Możesz skorzystać z biblioteki dat innej firmy, aby radzić sobie z datami. Na przykład:
var startOfWeek = moment().startOf('week').toDate(); var endOfWeek = moment().endOf('week').toDate();
Inną popularną alternatywą jest date-fns .
źródło
var startOfWeek = moment().startOf('isoweek').toDate();
var endOfWeek = moment().endOf('isoweek').toDate();
Możesz również użyć następujących linii kodu, aby uzyskać pierwszą i ostatnią datę tygodnia:
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));
Mam nadzieję, że to się przyda.
źródło
Oto szybki sposób na uzyskanie pierwszego i ostatniego dnia dla dowolnego dnia rozpoczęcia. wiedząc to:
1 dzień = 86 400 000 milisekund.
Wartości dat w JS są podawane w milisekundach
Przepis: określ, ile dni musisz usunąć, aby otrzymać dzień rozpoczęcia tygodnia (pomnóż przez milisekundy 1 dnia). Pozostaje tylko 6 dni, aby otrzymać dzień zakończenia.
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
źródło
Doskonała (i niezmienna) biblioteka date-fns radzi sobie z tym najbardziej zwięźle:
const start = startOfWeek(date); const end = endOfWeek(date);
Domyślnym dniem rozpoczęcia tygodnia jest niedziela (0), ale można go zmienić na poniedziałek (1) w następujący sposób:
const start = startOfWeek(date, {weekStartsOn: 1}); const end = endOfWeek(date, {weekStartsOn: 1});
źródło
Mógłbyś zrobić coś takiego
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);
Gdzie
startDay
jest liczba od 0 do 6, gdzie 0 oznacza niedzielę (np. 1 = poniedziałek, 2 = wtorek itd.).źródło
SetDate
ustala dzień miesiąca. Używanie nasetDate
początku i na końcu miesiąca spowoduje niewłaściwy tydzień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
Jeśli ustawisz datę 01 lipca 2014 r., Pierwszy dzień będzie wyświetlany jako 29 czerwca 2014 r., A ostatni dzień jako 05 czerwca 2014 r. Zamiast 05 lipca 2014 r.
Więc pokonaj ten problem, którego użyłem
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
źródło
Działa to niezależnie od zmian roku i miesiąca.
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());
źródło
W takich przypadkach polecam korzystać z Moment.js. Miałem scenariusze, w których musiałem sprawdzić aktualną datę i godzinę, w tym tygodniu, w tym miesiącu i w tym kwartale. Powyższa odpowiedź pomogła mi, więc pomyślałem, że podzielę się również resztą funkcji.
Aby uzyskać aktualną datę i godzinę w określonym formacie
case 'Today': moment().format("DD/MM/YYYY h:mm A"); case 'This Week': moment().endOf('isoweek').format("DD/MM/YYYY h:mm A");
Tydzień zaczyna się od niedzieli i kończy w sobotę, jeśli użyjemy po prostu „tygodnia” jako parametru funkcji endOf, ale aby otrzymać niedzielę jako koniec tygodnia, musimy użyć „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");
Wybrałem ten format według moich potrzeb. Możesz zmienić format zgodnie z wymaganiami.
źródło
//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()) )); },
* aktualna data == 30.06.2016 i poniedziałek to pierwszy dzień tygodnia.
Działa również przez różne miesiące i lata. Testowane z pakietem qunit:
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); });
źródło
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));
Będzie to przydatne w przypadku każdego scenariusza dotyczącego dat.
źródło
metoda krtek jest błędna, przetestowałem to
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);
to działa
źródło
Chociaż pytanie wydaje się przestarzałe, muszę zwrócić uwagę na problem.
Pytanie: Co się stanie 1 stycznia 2016 roku?
Myślę, że większość powyższych rozwiązań oblicza początek tygodnia na 27.12.2016. Z tego powodu myślę, że prawidłowe obliczenia powinny wyglądać tak, jak poniżej;
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;
źródło
Niezła sugestia, ale wczoraj masz mały problem. Powinieneś to zmienić na:
lastday = new Date(firstday.getTime() + 60 * 60 *24 * 6 * 1000);
źródło
Podejście momentowe zadziałało dla mnie we wszystkich przypadkach (chociaż nie testowałem granic, takich jak koniec roku, lata przestępne). Jedyną poprawką w powyższym kodzie jest parametr "isoWeek", jeśli chcesz rozpocząć tydzień od poniedziałku.
let startOfWeek = moment().startOf("isoWeek").toDate(); let endOfWeek = moment().endOf("isoWeek").toDate();
źródło
Używając czystego javascript, możesz użyć poniższej funkcji, aby uzyskać pierwszy i ostatni dzień tygodnia z dowolnymi ustawieniami dnia na początek tygodnia.
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; };
Ostatni dzień tygodnia to zaledwie 6 dni od pierwszego dnia tygodnia
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; };
Test:
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
źródło
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, }; };
Maszynopis
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, }; };
źródło
Dodaliśmy kod jquery, który pokazuje bieżący tydzień dni od poniedziałku do niedzieli.
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);
źródło
Stare pytanie z wieloma odpowiedziami, więc kolejne nie będzie problemem. Kilka ogólnych funkcji pozwalających uzyskać początek i koniec różnego rodzaju jednostek czasu.
Na początek i koniec tygodnia jako dzień początkowy tygodnia domyślnie jest niedziela (0), ale można minąć dowolny dzień (poniedziałek - 1, wtorek - 2 itd.). Jednak używa tylko kalendarza gregoriańskiego.
Funkcje nie zmieniają daty źródłowej, więc aby sprawdzić, czy data przypada w tym samym tygodniu, co inna data (tydzień rozpoczynający się w poniedziałek):
if (d >= startOf('week', d1, 1) && d <= endOf('week', d1, 1)) { // d is in same week as d1 }
lub w bieżącym tygodniu rozpoczynającym się w niedzielę:
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()); });
źródło
Mała zmiana w odpowiedzi @Chris Lang. jeśli chcesz, aby poniedziałek był pierwszym dniem, użyj tego.
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 @Chris Lang
źródło
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
źródło