Сегодня моему приятелю было нужно сделать на работе инструмент, частью функционала которого была работа с кварталами. А именно, необходимо было узнавать номер квартала для даты, а также находить его границы. У меня было свободное время и я решил тоже попробовать решить такую задачку.
Тут же нагуглили этот полезный ответ 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»