【问题标题】:Get current quarter in year with javascript使用 javascript 获取当前季度
【发布时间】:2012-08-12 11:10:18
【问题描述】:

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

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

【问题讨论】:

  • quarter 的标准是什么?在某些情况下,它们是 1 月到 12 月,其他是 7 月到次年的 6 月,依此类推。而且它们可能与月份不一致。
  • 近似值没问题,如果是休息日那不是世界末日,但是如果有另一种方法可以在不依赖月份的情况下获得当前季度。
  • 这可以帮助你[用小提琴堆栈答案][1] [1]:stackoverflow.com/a/20989200/2837412

标签: javascript jquery math date datetime


【解决方案1】:

假设 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),以便精确到天。

根据您对“本季度剩余天数”的实际定义,它也可能减一。

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

【讨论】:

  • 鉴于 OP 认为 8 月是 Q2,1 月到 3 月不太可能是 Q1。不过,硬编码的解决方案是可行的。
  • @Rob,我认为示例 2 只是我们 可能 的一个季度。我认为 OP 并没有说明它对应于当前月份有人问过这个问题(八月)。
  • 你肯定需要一个 Math.floor 来计算你的结果吗?也没有名为“now”的变量,我猜你的意思是用“today”代替?
  • @lee_mcmullen,因此是“未经测试”的评论 :-) 恭喜您成为一年多来第一个发现 today/now 错误的人,已根据您的建议解决了这两个问题。跨度>
  • @SteveSeeger,不确定你在说什么,季度 仅由月份决定。夏令时似乎与这里无关,你要么在一个月内,要么不在。或许你可以进一步解释一下?
【解决方案2】:

鉴于您尚未提供任何标准来确定“*我们目前所处的季度”,因此可以建议您使用一种算法,然后您必须适应您需要的任何标准。例如

// 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;
}

作为可运行的 sn-p 并包括年份:

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 月 1 日、4 月、7 月和 10 月 1 日开始,以下是一个季度的剩余天数,它在各种浏览器中进行了测试,包括 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);
}

【讨论】:

  • $NaN?我不知道你是怎么得到的,上面的代码是在 Firefox 和 IE 9 中测试的,它是纯 ECMAScript,所以与 jQuery 无关。所有这些都应该适用于几乎所有支持 javascript 的浏览器,当然包括 IE 和 NN 4 之后的所有浏览器。
  • 是的,很酷,这是 ie 6 的问题,遗憾的是,我正在构建它的客户无法“升级”以喜欢 chrome 或其他东西。
  • 您的 daysleftInquarter 示例不正确,当我经过当前月份时,它一直返回 60
  • @Simon_Weaver — 添加了一个可运行的带有年份的 sn-p。
  • @Simon_Weaver — 新函数返回 [y,m]。 ;-) 实际表达式的格式取决于用户,如果需要可排序性,则适合年/季度。我的偏好是 2019Q1,它非常符合 ISO 标准,所以这可能是为什么美国似乎更喜欢其他东西,比如 Q1'19 或 Q1/19 或类似的不会按词汇排序的东西。 :-(
【解决方案3】:

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

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
【解决方案4】:
function getQuarter(d) {
  return Math.floor(d.getMonth()/3) + 1);
}

编辑:我遗漏了 %4,完全正确,谢谢 Clement

【讨论】:

  • 不需要%4
【解决方案5】:

你可以使用moment包:

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

moment().quarter()

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

季度开始日期

moment().quarter(moment().quarter()).startOf('quarter');

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

moment("2019", "YYYY").quarter(4).startOf('quarter');

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

moment().startOf('quarter');

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

季度结束日期

moment().quarter(moment().quarter()).endOf('quarter');

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

moment("2019", "YYYY").quarter(4).endOf('quarter');

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

moment().endOf('quarter');

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

【讨论】:

    【解决方案6】:

    取决于月份

     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.
    

    【讨论】:

      【解决方案7】:

      这对我有用!

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

      【讨论】:

      • 正是我想要的,因为我想要的是实际季度,而不是美国财政年度。谢谢!
      • 由于月份是从零开始的,因此您需要加 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]
      【解决方案8】:

      它效率不高或不可读,但它具有单线风格。

      (new Date(new Date().getFullYear(), Math.floor((new Date().getMonth() + 3) / 3) * 3, 1) - new Date()) / 86400000
      

      【讨论】:

        【解决方案9】:
        // Set Period Function
          SetPeriod(SelectedVal) {
            try {
              if (SelectedVal === '0') { return; }
              if (SelectedVal != null) {
                let yrf: number, mtf: number, dyf: number, yrt: number, mtt: number, dyt: number, dtf: any, dtt: any;
                let dat = new Date();
                let q = 0;
                switch (SelectedVal) {
                  case '-1': // Not specify
                    frm = ''; to = '';
                    return;
                  case '0': // As specify
                    break;
                  case '1': // This Month
                    yrf = yrt = dat.getUTCFullYear();
                    mtf = mtt = dat.getUTCMonth();
                    dyf = 1; dyt = this.getDaysInMonth(mtf, yrf);
                    break;
                  case '2': // Last Month
                    dat.setDate(0); // 0 will result in the last day of the previous month
                    dat.setDate(1); // 1 will result in the first day of the month
                    yrf = yrt = dat.getUTCFullYear();
                    mtf = mtt = dat.getUTCMonth();
                    dyf = 1; dyt = this.getDaysInMonth(mtf, yrf);
                    break;
                  case '3': // This quater
                    q = Math.ceil((dat.getUTCMonth()) / 3);
                  // tslint:disable-next-line:no-switch-case-fall-through
                  case '4': // Last quater
                    if (q === 0) { q = Math.ceil(dat.getUTCMonth() / 3) - 1; if (q === 0) { q = 1; } }
                    yrf = yrt = dat.getUTCFullYear();
                    if (q === 1) {
                      mtf = 0; mtt = 2;
                      dyf = 1; dyt = 31;
                    } else if (q === 2) {
                      mtf = 3; mtt = 5;
                      dyf = 1; dyt = 30;
                    } else if (q === 3) {
                      mtf = 6; mtt = 8;
                      dyf = 1; dyt = 30;
                    } else if (q === 4) {
                      mtf = 9; mtt = 11;
                      dyf = 1; dyt = 31;
                    }
                    break;
                  case '6': // Last year
                    dat = new Date(dat.getUTCFullYear(), 0, 1);
                  // tslint:disable-next-line:no-switch-case-fall-through
                  case '5': // This year
                    yrf = yrt = dat.getUTCFullYear();
                    mtf = 0; mtt = 11;
                    dyf = 1; dyt = 31;
                    break;
                }
        
                // Convert to new Date
                dtf = new Date(yrf, mtf, dyf);
                dtt = new Date(yrt, mtt, dyt);
                console.log('dtf', dtf);
                console.log('dtt', dtt);
        
              }
            } catch (e) {
              alert(e);
            }
          }
        
        
        
        // Get Day in Month
          getDaysInMonth = (month: number, year: number) => {
            return new Date(year, month + 1, 0).getDate();
          }
        

        【讨论】:

          【解决方案10】:

          就我而言,季度取决于输入的季度开始日期(月、日)和季度持续时间(3、6)

          function getCurrentQuarter(startDateString, quarterDuration) {
              var startDate = new Date(startDateString)
              // default order of months
              var months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
              let startMonth = startDate.getMonth() + 1
              let startMonthIndex = months.indexOf(startMonth)
              // rotate months to get start month first
              if (startMonthIndex != 0) {
                  var monthsNew = months.slice(startMonthIndex, months.length)
                  months = monthsNew.concat(months.slice(0, startMonthIndex))
              }
              
              let today = new Date()
              let thisMonth = today.getMonth() + 1
              let thisMonthIndex = months.indexOf(thisMonth) + 1
              // compare with date
              let thisDay = today.getDate()
              let startDay = startDate.getDate()
              if (thisDay < startDay) {
                  // this is previous month
                  if (thisMonthIndex == 1) {
                      thisMonthIndex = 12
                  } else {
                      thisMonthIndex = thisMonthIndex - 1
                  }
              }
              // find quarter
              let thisQuarter = Math.ceil(thisMonthIndex / quarterDuration)
          
              return thisQuarter
          }
          

          getCurrentQuarter('2021-03-15', 3)

          【讨论】:

            【解决方案11】:

            这是我的看法

            var todayDate = new Date(new Date().setUTCHours(0, 0, 0, 0));
            var currentQuarter = Math.floor(todayDate.getMonth() / 3);
            var firstDate = new Date(
              new Date(todayDate.getFullYear(), currentQuarter * 3, 1).setUTCHours(0, 0, 0, 0)
            );
            var endDate = new Date(
              new Date(
                firstDate.getFullYear(),
                firstDate.getMonth() + 3,
                0
              ).setUTCHours(0, 0, 0, 0)
            );
            console.log(endDate)

            【讨论】:

              猜你喜欢
              • 2020-09-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-10-30
              相关资源
              最近更新 更多