Подтвердить что ты не робот

Как получить первый и последний день недели в JavaScript

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

4b9b3361

Ответ 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