Есть ли простой/встроенный способ определения текущего финансового квартала?
Пример:
- Jan-Mar: 1st
- Апрель-июль: 2-й
- Jul-Sept: 3rd
- Oct-Dec: 4th
Есть ли простой/встроенный способ определения текущего финансового квартала?
Пример:
Теперь это поддерживается в данный момент. Как легко:
moment('2014-12-01').utc().quarter() //outputs 4
moment().quarter(); //outputs current quarter ie. 2
Используя версию 2.14.1+, вы можете сделать что-то вроде следующего:
moment().quarter()
возвращает текущий четвертый номер: 1, 2, 3, 4.
moment().quarter(moment().quarter()).startOf('quarter');
Вернет текущий квартал с датой, установленной на дату начала квартала.
moment().quarter(moment().quarter()).startOf('quarter');
Вернул бы текущий квартал с датой, установленной на дату окончания квартала.
Вы также можете определить функцию, которая принимает соответствующий номер в качестве аргумента (1,2,3,4), и возвращает объект, содержащий дату начала и окончания квартала.
function getQuarterRange(quarter) {
const start = moment().quarter(quarter).startOf('quarter');
const end = moment().quarter(quarter).endOf('quarter');
return {start, end};
}
Используйте этот простой код, чтобы получить весь квартал, основанный на январь и апрель
Код:
// startMonth should be january or april
function setQuarter(startMonth) {
var obj = {};
if(startMonth=='january'){
obj.quarter1 = {start:moment().month(0).startOf('month'),end:moment().month(2).endOf('month')}
obj.quarter2 = {start:moment().month(3).startOf('month'),end:moment().month(5).endOf('month')}
obj.quarter3 = {start:moment().month(6).startOf('month'),end:moment().month(8).endOf('month')}
obj.quarter4 = {start:moment().month(9).startOf('month'),end:moment().month(11).endOf('month')}
console.log(obj);
return obj;
}
else if(startMonth=='april'){
obj.quarter1 = {start:moment().month(3).startOf('month'),end:moment().month(5).endOf('month')}
obj.quarter2 = {start:moment().month(6).startOf('month'),end:moment().month(8).endOf('month')}
obj.quarter3 = {start:moment().month(9).startOf('month'),end:moment().month(11).endOf('month')}
obj.quarter4 = {start:moment().month(0).startOf('month').add('years',1),end:moment().month(2).endOf('month').add('years',1)}
console.log(obj);
return obj;
}
}
setQuarter('april');
Я не думаю, что любой из этих ответов объясняет, как получить финансовый квартал. Они объясняют, как получить календарный квартал.
У меня нет чистого ответа, потому что это привело меня сюда. Но финансовый квартал - это то, что действительно нужно. И это основано на начальном месяце финансового года.
Например, если месяц начала работы в моей компании - февраль. Тогда на момент написания этого 9 января 2017 года я на самом деле в четвертом квартале 2016 года.
Для этого нам нужен способ получить квартал относительно поставленного целого числа начального месяца.
В настоящий момент ничего не создано, но есть разговор, чтобы добавить токены форматирования для кварталов. https://github.com/timrwood/moment/pull/540
Тем временем вы можете использовать что-то вроде следующего.
Math.floor(moment().month() / 3) + 1;
Или, если вы хотите его в прототипе момента, сделайте это.
moment.fn.quarter = function () {
return Math.floor(this.month() / 3) + 1;
}
Формула, которая, кажется, работает для меня:
Math.ceil((moment().month() + 1) / 3);
moment(). month() возвращает формат 0-11 месяцев, поэтому мы должны добавить один
THE ACTUAL MONTH = (moment().month() + 1)
то мы должны разделить на 3, так как есть 3 месяца в квартал.
HOW MANY QUARTERS PASSED = (THE ACTUAL MONTH) / 3
и тогда мы должны получить потолок этого (округленный до ближайшего квартала)
CEILING(HOW MANY QUARTERS PASSED)
ИЗМЕНИТЬ:
Официальная формула (еще не объявлена):
~~((this.month()) / 3) + 1;
что означает Math.floor((this.month()) / 3) + 1;
Простейший способ сделать это -
Math.floor(moment.month() / 3)
Это даст вам индекс на основе нуля. т.е. 0, 1, 2 или 3.
Затем, если вы хотите использовать буквенное число, просто добавьте его.
Ответ, который дал Нищит Дханани, является правильным, но имеет одну проблему в "апрельском" сценарии.
Вопрос: если ваш финансовый год - апрель, то в течение первых 3 месяцев, т.е. ЯНВ, ФЕВРАЛЬ И МАР
obj.quarter1.start date returns, 1-April-CurrentYear [incorrect Value]
obj.quarter4.end date retunrs, 31-March-NextYear [incorrect Value]
Правильные значения должны быть,
Start = 1-April-PreviuosYear
End = 31-March-CurrentYear
Итак, учитывая первые 3 месяца, можно написать что-то вроде:
const obj = {};
/* 0-Jan, 1-Feb, 2-Mar */
if (moment().month() <= 2) {
obj.quarter1 = { start: moment().month(3).startOf('month').add('years', -1), end: moment().month(5).endOf('month').add('years', -1) };
obj.quarter2 = { start: moment().month(6).startOf('month').add('years', -1), end: moment().month(8).endOf('month').add('years', -1) };
obj.quarter3 = { start: moment().month(9).startOf('month').add('years', -1), end: moment().month(11).endOf('month').add('years', -1) };
obj.quarter4 = { start: moment().month(0).startOf('month'), end: moment().month(2).endOf('month') };
} else {
obj.quarter1 = { start: moment().month(3).startOf('month'), end: moment().month(5).endOf('month') };
obj.quarter2 = { start: moment().month(6).startOf('month'), end: moment().month(8).endOf('month') };
obj.quarter3 = { start: moment().month(9).startOf('month'), end: moment().month(11).endOf('month') };
obj.quarter4 = { start: moment().month(0).startOf('month').add('years', 1), end: moment().month(2).endOf('month').add('years', 1) };
}
console.log(obj);