Как получить первый и последний день недели в JavaScript
У меня есть
16 ответов:
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"
это работает для первого дня = воскресенье на этой неделе и последний день = суббота на этой неделе. Продление его работы с понедельника по воскресенье тривиально.
заставить его работать с первым и последним днями в разные месяцы остается в качестве упражнения для пользователя
будьте осторожны с принятым ответом, он не устанавливает время 00:00:00 и 23:59:59, поэтому у вас могут возникнуть проблемы.
Я рекомендую использовать момент.js, чтобы иметь дело с датами. Для вашего случая:
var startOfWeek = moment().startOf('week').toDate(); var endOfWeek = moment().endOf('week').toDate();
Это всего лишь небольшой случай использования, это действительно просто сделать много сложных операций.
вы можете увидеть узнать больше здесь:http://momentjs.com/
вы также можете использовать следующие строки кода, чтобы получить первую и последнюю дату недели:
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));
надеюсь, это будет полезно..
вот быстрый способ получить первый и последний день, для любого стартового дня. зная это:
1 день = 86,400,000 миллисекунд.
значения дат JS находятся в миллисекундах
рецепт: выяснить, сколько дней вам нужно удалить, чтобы получить день начала вашей недели (умножьте на 1 день стоит миллисекунд). Все, что осталось после этого, чтобы добавить 6 дней, чтобы получить свой последний день.
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
Я рекомендую использовать момент.JS для таких случаев. У меня были сценарии, где я должен был проверить текущее время даты, на этой неделе, в этом месяце и в этом квартале. Выше ответ помог мне, так что я думал, чтобы разделить остальные функции, а также.
просто, чтобы получить текущую дату в формате
case 'Today': moment().format("DD/MM/YYYY h:mm A"); case 'This Week': moment().endOf('isoweek').format("DD/MM/YYYY h:mm A");
неделя начинается с воскресенья и заканчивается в субботу, если мы просто используем 'week' в качестве параметра для функции endOf, но чтобы получить воскресенье в конце недели, нам нужно использовать "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");
Я выбрал этот формат в соответствии с моей потребностью. Вы можете изменить формат согласно вашему требованию.
SetDate
устанавливает день месяца. ИспользуяsetDate
в начале и конце месяца,приведет к неверной неделю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
если дата установки u 01-Jul-2014, то она покажет firstday как 29-Jun-2014 и последний день как 05-Jun-2014 вместо 05-Jul-2014
чтобы преодолеть эту проблему, я использовал
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
это работает через год и месяц перемен.
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());
отличный (и неизменный) дата-ФНС библиотека обрабатывает это наиболее лаконично:
const start = startOfWeek(date); const end = endOfWeek(date);
метод кртека имеет некоторые ошибки, я проверил это
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);
он работает
вы могли бы сделать что-то подобное
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);
здесь
startDay
- это число от 0 до 6, где 0 означает воскресенье (т. е. 1 = понедельник, 2 = вторник и т. д.).
хорошее предложение, но у вас есть небольшая проблема в последний день. Вы должны изменить его на:
lastday = new Date(firstday.getTime() + 60 * 60 *24 * 6 * 1000);
//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()) )); },
* текущая дата == 30.06.2016 и понедельник-первый день недели.
Он также работает в течение разных месяцев и лет. Протестировано с QUnit suite:
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); });
хотя вопрос кажется устаревшим, я должен указать на проблему.
вопрос: что произойдет 1 января 2016 года?
Я думаю, что большинство из вышеперечисленных решений рассчитывают начало недели как 27.12.2016. По этой причине я думаю, что правильный расчет должен быть как ниже просто;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;
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));
это будет полезно для любого сценария даты.
моментальный подход работал для меня для всех случаев (хотя я не проверял границы , такие как конец года, високосные годы ). Единственным исправлением в приведенном выше коде является параметр "isoWeek", если вы хотите начать неделю с понедельника.
let startOfWeek = moment().startOf("isoWeek").toDate(); let endOfWeek = moment().endOf("isoWeek").toDate();
просто используя чистый javascript, вы можете использовать функцию ниже, чтобы получить первый день и последний день недели с свободно устанавливаемым днем для начала недели.
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; };
последний день недели составляет 6 дней после первого дня недели
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; };
тест:
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