У меня есть объект today = new Date();
. Мне нужно получить первый и последний день текущей недели. Мне нужны оба варианта для воскресенья и понедельника как начало и конец дня недели. Сейчас я немного путаюсь с кодом. Можете ли вы мне помочь?
Как получить первый и последний день недели в JavaScript
Ответ 1
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"
Это работает для первого дня = воскресенья этой недели и последнего дня = суббота на этой неделе. Расширение его для работы с понедельника по воскресенье является тривиальным.
Работа с первым и последним днями в разные месяцы остается как упражнение для пользователя
Ответ 2
Будьте осторожны с принятым ответом, он не устанавливает время до 00:00:00 и 23:59:59, поэтому у вас могут быть проблемы.
Я рекомендую использовать Moment.js для работы с датами. Для вашего случая:
var startOfWeek = moment().startOf('week').toDate();
var endOfWeek = moment().endOf('week').toDate();
Это всего лишь небольшой вариант использования, очень просто выполнить множество сложных операций.
Вы можете узнать больше здесь: http://momentjs.com/
Ответ 3
Вы также можете использовать следующие строки кода для получения первой и последней даты недели:
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));
Надеюсь, это будет полезно.
Ответ 4
Вот быстрый способ получить первый и последний день, для любого стартового дня. зная, что:
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
Ответ 5
Я рекомендую использовать Moment.js для таких случаев. У меня были сценарии, где мне приходилось проверять текущее время, на этой неделе, в этом месяце и в это время. Выше ответа помог мне, поэтому я решил поделиться остальными функциями.
Просто чтобы получить текущее время в определенном формате
case 'Today':
moment().format("DD/MM/YYYY h:mm A");
case 'This Week':
moment().endOf('isoweek').format("DD/MM/YYYY h:mm A");
Неделя начинается с воскресенья и заканчивается в субботу, если мы просто используем "неделю" в качестве параметра для функции 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");
Я выбрал этот формат в соответствии с моей потребностью. Вы можете изменить формат в соответствии с вашими требованиями.
Ответ 6
Это работает в течение года и месяца.
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());
Ответ 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 = вторник и т.д.).
Ответ 8
Метод krtek имеет некоторые ошибки, я тестировал это
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);
работает
Ответ 9
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 установит Date 01-Jul-2014, он будет показан в первый день как 29 июня 2014 года, а в прошлый день - с 05 июня 2014 года, а не с 05 июля 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
Ответ 10
Хорошее предложение, но у вас возникла небольшая проблема в прошлый день. Вы должны изменить его на:
lastday = new Date(firstday.getTime() + 60 * 60 *24 * 6 * 1000);
Ответ 11
Хотя вопрос выглядит как устаревший, я должен указать на проблему.
Вопрос: Что будет с 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;
Ответ 12
//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);
});
Ответ 13
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));
Это будет полезно для любого сценария даты.
Ответ 14
Отличная (и неизменная) дата-fns library обрабатывает это наиболее кратко:
const start = startOfWeek(date);
const end = endOfWeek(date);
Ответ 15
Мгновенный подход работал у меня во всех случаях (хотя я не тестировал границы, такие как конец года, високосные годы). Только исправление в приведенном выше коде является параметром isoWeek, если вы хотите начать неделю с понедельника.
let startOfWeek = moment().startOf("isoWeek").toDate();
let endOfWeek = moment().endOf("isoWeek").toDate();
Ответ 16
Просто используя чистый 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