Работа с кварталами (время) в JavaScript

Сегодня моему приятелю было нужно сделать на работе инструмент, частью функционала которого была работа с кварталами. А именно, необходимо было узнавать номер квартала для даты, а также находить его границы. У меня было свободное время и я решил тоже попробовать решить такую задачку.

Тут же нагуглили этот полезный ответ Math.floor((date.getMonth() + 3) / 3), однако оставалось находить границы квартала.

В то время, как я тут же принялся быдлокодить такую функцию:

function getQuarterBounds(date) {
    date = date || new Date();

    var q = Math.floor((date.getMonth() + 3) / 3);
    var year = date.getFullYear();
    var quarters = {
        1: {
            start: '01-01',
            end: '03-31'
        }, 2: {
            start: '04-01',
            end: '06-30'
        }, 3: {
            start: '07-01',
            end: '09-30'
        }, 4: {
            start: '10-01',
            end: '12-31'
        }
    };

    return [
        new Date(year + '-' + quarters[q].start),
        new Date(year + '-' + quarters[q].end)
    ];
}

Мой приятель обратил внимание, что функция setMonth() вторым аргументом имеет день, который в случае, если равен 0, ставит последний день предыдущего месяца, а при -1 и меньших значений начинает мотать дальше.

В нашем случае этот функционал оказался как раз очень удобен:

function getQuarterBounds(date) {
    date = date || new Date();

    return [
        new Date(new Date().setMonth(
            date.getMonth() - date.getMonth() % 3, 1)),
        new Date(new Date().setMonth(
            date.getMonth() + 3 - date.getMonth() % 3, 0))
    ];
}

Да уж, иногда бывает, что вспоминаешь неутешительное «RTFM»

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>