使用JavaScript获取当前年份的季度

47

如何使用 JavaScript 获取当前季度?我正在尝试检测我们目前处于哪个季度,例如2季度。

编辑 而如何计算本季度剩余的天数?


你对 财政年度的标准是什么?在某些情况下,它们可能是一月到十二月,而在其他情况下,可能是七月到次年六月等。它们也可能与月份不对齐。 - RobG
如果不是必须的话,大致的时间也可以接受。如果没有依赖于月份的方法,能够获取当前季度的其他方式就更好了。一天的差距并不会造成太大问题,但能够找到替代方法将是理想的。 - John Doe
这可能会对你有所帮助 Stack answer with fiddle - Nishchit
14个回答

95

假设1月到3月被认为是第一季度(有些国家/公司将财政年度与日历年度分开),以下代码应该可以工作:

var today = new Date();
var quarter = Math.floor((today.getMonth() + 3) / 3);

这给你:

Month      getMonth()  quarter
---------  ----------  -------
January         0         1
February        1         1
March           2         1
April           3         2
May             4         2
June            5         2
July            6         3
August          7         3
September       8         3
October         9         4
November       10         4
December       11         4

如何获取本季度剩余天数,基本上需要计算下一季度的第一天,并计算两者之间的差值,类似于:

var today = new Date();
var quarter = Math.floor((today.getMonth() + 3) / 3);
var nextq;
if (quarter == 4) {
    nextq = new Date (today.getFullYear() + 1, 1, 1);
} else {
    nextq = new Date (today.getFullYear(), quarter * 3, 1);
}
var millis1 = today.getTime();
var millis2 = nextq.getTime();
var daydiff = (millis2 - millis1) / 1000 / 60 / 60 / 24;

这还没有经过测试,但理论基础是可靠的。基本上创建一个对应于下个季度的日期,将它和今天转换为自纪元开始以来的毫秒数,然后用它们的差值得到毫秒数。

将其除以一天的毫秒数即可得到相差的天数。

这至少给出了剩余季度天数的大致数量。您可能需要微调它,以确保所有时间都设置为相同的值(00:00:00),以便计算出确切的天数差。

根据“季度中剩余天数”的实际定义,它也可能存在偏差。

但这应该是一个很好的起点。


你肯定需要在结果周围加上 Math.floor 才能得到四分之一吧?另外,没有名为“now”的变量,我猜你想使用“today”对吧? - lee_mcmullen
2
@lee_mcmullen,因此出现了“未经测试”的评论 :-) 恭喜你成为一年来第一个发现“today/now”错误的人,我已根据你的建议修复了这两个问题。 - paxdiablo
@paxdiablo谢谢,这对我很有帮助。你知道如何计算FYTD和CYTD吗?就像上面那样?http://stackoverflow.com/questions/22909656/caluclate-start-date-and-end-date-for-fiscal-year-to-date-fytd-and-cytd-calen - SivaRajini
1
@SteveSeeger,不确定你在谈论什么,季度完全由月份决定。夏令时似乎与此毫不相关,你要么在某个月份,要么不在。也许你可以进一步解释一下? - paxdiablo
Steve:啊,现在我明白了。让我看看它,不确定为什么群集会拒绝它,如果它是有效的。 - paxdiablo
显示剩余4条评论

48

鉴于您没有提供任何确定“我们当前处于哪个季度”标准的标准,可以建议一种算法,然后根据您需要的标准进行适应。例如:

// For the US Government fiscal year
// Oct-Dec = 1
// Jan-Mar = 2
// Apr-Jun = 3
// Jul-Sep = 4
function getQuarter(d) {
  d = d || new Date();
  var m = Math.floor(d.getMonth()/3) + 2;
  return m > 4? m - 4 : m;
}

作为可运行的代码片段并包含年份:

function getQuarter(d) {
  d = d || new Date();
  var m = Math.floor(d.getMonth() / 3) + 2;
  m -= m > 4 ? 4 : 0;
  var y = d.getFullYear() + (m == 1? 1 : 0);
  return [y,m];
}

console.log(`The current US fiscal quarter is ${getQuarter().join('Q')}`);
console.log(`1 July 2018 is ${getQuarter(new Date(2018,6,1)).join('Q')}`);

您可以根据需要适应不同的财务或日历季度。您还可以执行以下操作:

function getQuarter(d) {
  d = d || new Date(); // If no date supplied, use today
  var q = [4,1,2,3];
  return q[Math.floor(d.getMonth() / 3)];
}

根据所需季度的定义,使用不同的q数组。

编辑

以下代码获取如果季度从1月、4月、7月和10月开始的话,季度中剩余的天数。它已在各种浏览器中进行了测试,包括IE 6(尽管它使用基本的ECMAScript应该可以在任何地方工作):

function daysLeftInQuarter(d) {
  d = d || new Date();
  var qEnd = new Date(d);
  qEnd.setMonth(qEnd.getMonth() + 3 - qEnd.getMonth() % 3, 0);
  return Math.floor((qEnd - d) / 8.64e7);
}

1
你的daysleftInquarter示例不正确,当我传递当前月份时它会持续返回60。 - John Doe
1
@Simon_Weaver - 添加了一个可运行的代码片段,其中包含年份。 - RobG
@RobG 谢谢,但我的意思是该函数可以返回一个元组 { quarter, year },其中对于 Q1,年份实际上是 calendarDate.Year + 1,因为它属于下一年。如果人们不这样做并对数据进行排序,他们将得到一个巨大的混乱! - Simon_Weaver
2
@Simon_Weaver - 新函数返回 [y,m]。;-) 实际表达式的格式由用户决定,如果需要可排序性,则年/季度适合。我更喜欢2019Q1,这相当于ISO标准,所以美国似乎更喜欢其他东西,比如Q1'19或Q1/19或类似的不会按字典顺序排序的东西。 :-( - RobG
哎呀,为什么这么难啊?为什么你们都要用 floor 和加 1,当你可以直接使用 ceil 呢? return Math.ceil((d.getMonth() + 1) / 3) - Disorder
显示剩余5条评论

8
function getQuarter(d) {
  return Math.floor(d.getMonth()/3) + 1);
}

编辑:我错过了%4,完全正确,谢谢Clement


1
% 4 不需要。 - Clement

7
如果第一种解决方法不起作用,您可以将其调整为您想要的范围。
var today = new Date();
var month = now.getMonth();
var quarter;
if (month < 4)
  quarter = 1;
else if (month < 7)
  quarter = 2;
else if (month < 10)
  quarter = 3;
else if (month < 13)
  quarter = 4;

由于月份是从零开始计数的,因此4/7/10/13应该改为3/6/9/12。 - Patrick McElhaney

5
你可以使用moment包:
使用moment包回答你的问题是:
moment().quarter()

以下是使用moment包的季度起始日期和结束日期:
季度开始日期
moment().quarter(moment().quarter()).startOf('quarter');

将日期设置为季度开始日期,并返回当前季度。
moment("2019", "YYYY").quarter(4).startOf('quarter');

将返回"2019"年第4季度的开始日期。

moment().startOf('quarter');

返回当前年份当前季度的起始日期。
季度结束日期。
moment().quarter(moment().quarter()).endOf('quarter');

将日期设置为季度结束日期,并返回当前季度。
moment("2019", "YYYY").quarter(4).endOf('quarter');

返回2019年第四季度的结束日期。

moment().endOf('quarter');

返回当前年份当前季度的结束日期。

4

根据月份变化

 var date = new Date();     
 var quarter =  parseInt(date.getMonth() / 3 ) + 1 ;

依赖日期

 var date = new Date();    
 var firstday = new Date(date.getFullYear(),0,1); // XXXX/01/01
 var diff = Math.ceil((date - firstday) / 86400000); 
 // a quarter is about 365/4 
 quarter =  parseInt( diff / ( 365/ 4 )) + 1 
 // if today is 2012/01/01, the value of quarter  is  1.

4
这对我很有帮助!

var d = new Date();
var quarter = Math.ceil(d.getMonth() / 3);

console.log(quarter)


正是我想要的,因为我想要实际的季度,而不是美国财政年度。谢谢! - Mayer Spitz
1
由于月份是从零开始计算的,因此您需要加1才能使其正常工作。[0,1,2,3,4,5,6,7,9,10,11].map(month => Math.ceil(month/3)) === [0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4] - Patrick McElhaney

1

我不知道为什么大家都使用floor,当你可以简单地使用ceil

function getQuarter(m) {
  return Math.ceil(m / 3)
}

// Test it
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].map(getQuarter);

如果月份从0开始计算,只需将月份数值加1即可:
function getQuarter(date) {
  const m = date.getMonth() + 1;
  return Math.ceil(m / 3)
}

1

通用、快速的性能(无除法,无浮点数),易于修改为其他标准

const now = new Date()
const currentMonth = now.getMonth() + 1
const currentQuarter = {
   1: 1, // January
   2: 1, // February
   3: 1, // March

   4: 2, // April
   5: 2, // May
   6: 2, // June

   7: 3, // July
   8: 3, // August
   9: 3, // September

   10: 4, // October
   11: 4, // November
   12: 4, // December
}[currentMonth]

console.log(currentQuarter)

1
我同意。处理整数比处理浮点数快得多,特别是如果您需要处理一个大数据集。 - Charles Owen

0

对于关心财政季度的任何人,这里有一种简单的方法,只需要0(1)的时间。首先,由于这是基于月份的固定数据,为什么不创建一个关联数组呢?请记住,JavaScript的月份从0开始,到11结束。

** getMonth(): Fiscal quarter

const FISCAL_QUARTER = {
   0:2,1:2,2:2,3:3,4:3,5:3,6:4,7:4,8:4,9:1,10:1,11:1
};
function getFiscalQuarter(d){   
   return FISCAL_QUARTER[d.getMonth()];
}
console.log(getFiscalQuarter(new Date()));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接