Как получить первый и последний день недели в JavaScript - PullRequest
72 голосов
/ 06 марта 2011

У меня есть today = new Date(); объект.Мне нужно получить первый и последний день текущей недели.Мне нужны оба варианта для воскресенья и понедельника как день начала и окончания недели.Я сейчас немного путаюсь с кодом.Вы можете мне помочь?

Ответы [ 16 ]

158 голосов
/ 06 марта 2011
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"

Это работает для первого дня = воскресенья этой недели и последнего дня = субботы для этой недели.Продлить его с понедельника на воскресенье тривиально.

Настройка работы с первым и последним днями в разные месяцы оставлена ​​для пользователя

48 голосов
/ 14 ноября 2014

Будьте осторожны с принятым ответом, он не устанавливает время на 00:00:00 и 23:59:59, поэтому у вас могут возникнуть проблемы.

Я рекомендую использовать Moment.js для работы с датами. Для вашего случая:

var startOfWeek = moment().startOf('week').toDate();
var endOfWeek   = moment().endOf('week').toDate();

Это всего лишь небольшой вариант использования, очень просто выполнять много сложных операций.

Узнать больше можно здесь: http://momentjs.com/

36 голосов
/ 02 ноября 2012

Вы также можете использовать следующие строки кода, чтобы получить первую и последнюю дату недели:

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

Надеюсь, это будет полезно ..

15 голосов
/ 20 февраля 2012

Вот быстрый способ получить первый и последний день любого стартового дня. зная, что:

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
8 голосов
/ 06 июня 2017

Отличная (и неизменная) библиотека date-fns обрабатывает это максимально кратко:

const start = startOfWeek(date);
const end = endOfWeek(date);
4 голосов
/ 06 марта 2011

Вы можете сделать что-то вроде этого

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 = вторник и т. Д.).

3 голосов
/ 20 ноября 2015

Работает с изменениями года и месяца.

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());
3 голосов
/ 18 ноября 2015

Я рекомендую использовать 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");

Неделя начинается с воскресенья и заканчивается в субботу, еслимы просто используем '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");

Я выбрал этот формат в соответствии со своими потребностями.Вы можете изменить формат в соответствии с вашими требованиями.

3 голосов
/ 08 июля 2014

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

Если для параметра Дата установлено значение 01-июль-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
2 голосов
/ 03 мая 2017
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));

Это будет полезно для любого сценария дат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...