使用javascript获取当前季度

Joh*_*Doe 26 javascript math jquery datetime date

如何通过javascript获取当前季度?我试图检测我们目前在哪个季度,例如2.

编辑我如何计算该季度剩余的天数?

pax*_*blo 60

假设1月到3月被视为Q1(某些国家/公司将其财政年度与其日历年分开),以下代码应该有效:

var today = new Date();
var quarter = Math.floor((today.getMonth() + 3) / 3);
Run Code Online (Sandbox Code Playgroud)

这给你:

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
Run Code Online (Sandbox Code Playgroud)

至于如何获得本季度的剩余天数,它基本上是在计算下一季度的第一天并找出差异,例如:

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;
Run Code Online (Sandbox Code Playgroud)

这是未经测试的,但理论是合理的.基本上创建一个对应于下一个季度的日期,将它和今天转换为自纪元开始以来的毫秒,然后差异是毫秒数.

将它除以一天中的毫秒数,你就得到天数的差异.

这给了你(至少大致)本季度剩余的天数.您可能需要对其进行微调以确保所有时间都设置为相同的值(00:00:00),以便差异在确切的天数内.

根据您对"季度剩余天数"的实际定义,它也可能会被一个人关闭.

但它应该是一个很好的起点.

  • @lee_mcmullen,因此"未经测试"评论:-)恭喜你成为第一个在一年多内收到'今天/现在'错误的人,根据你的建议解决了这两个问题. (2认同)

Rob*_*obG 36

鉴于您没有提供任何关于如何确定"我们当前所处的季度"的标准,可以建议您必须根据需要调整任何标准.例如

// 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;
}
Run Code Online (Sandbox Code Playgroud)

作为一个可运行的片段,包括年份:

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')}`);
Run Code Online (Sandbox Code Playgroud)

然后,您可以根据需要将其调整到各种财务或日历季度.你也可以这样做:

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)];
}
Run Code Online (Sandbox Code Playgroud)

然后q根据所需季度的定义使用不同的阵列.

编辑

如果它们在1月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);
}
Run Code Online (Sandbox Code Playgroud)

  • @Simon_Weaver —新函数返回`[y,m]`。;-)实际表达的格式取决于用户,如果需要可分类性,则适合年份/季度。我的首选是2019Q1,这完全符合ISO标准,因此可能是为什么美国似乎更喜欢其他东西,例如Q1'19或Q1 / 19或类似的词法无法排序的东西。:-( (2认同)

Wim*_*der 8

function getQuarter(d) {
  return Math.floor(d.getMonth()/3) + 1);
}
Run Code Online (Sandbox Code Playgroud)

编辑:我遗漏了%4,完全正确,谢谢克莱门特


Tom*_*ats 5

如果第一个解决方案不起作用,您可以将其调整到您想要的范围

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;
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以使用包:

使用 moment 包的问题的答案是:

moment().quarter()
Run Code Online (Sandbox Code Playgroud)

以下是使用 moment 包的季度的开始和结束日期:

季度开始日期

moment().quarter(moment().quarter()).startOf('quarter');
Run Code Online (Sandbox Code Playgroud)

将返回当前季度,并将日期设置为季度开始日期。

moment("2019", "YYYY").quarter(4).startOf('quarter');
Run Code Online (Sandbox Code Playgroud)

将返回“2019”年第四季度的开始日期。

moment().startOf('quarter');
Run Code Online (Sandbox Code Playgroud)

将返回当年当前季度的开始日期。

季度结束日期

moment().quarter(moment().quarter()).endOf('quarter');
Run Code Online (Sandbox Code Playgroud)

将返回当前季度,并将日期设置为季度结束日期。

moment("2019", "YYYY").quarter(4).endOf('quarter');
Run Code Online (Sandbox Code Playgroud)

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

moment().endOf('quarter');
Run Code Online (Sandbox Code Playgroud)

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