特定日期和今天之间的季度列表



我需要一个简单的帮助。我喜欢在 JavaScript 中有一个函数来生成两个日期之间的季度数组(或列表(。第一个是固定的,而第二个日期是今天。

例如:我希望我有一个从2016年第一天到今天的季度列表。所以我想有这样的清单

{Gen-Feb-Mar 2016,
Apr-May-June 2016,
Jul-Ago-Sep 2016,
Oct-Nov-Dec 2016,
Gen-Feb-Mar 2017}

最终目的是将其放入组合选择中。

谁能帮我?

提前致谢

如果您只是想构建此处的列表,则可以迭代开始年份与当前年份的差异,然后使用parseInt(new Date().getMonth() / 3 + 1)计算当前季度

var d = new Date(),
  y = d.getFullYear(),
  m = d.getMonth(),
  quarters = ['Jan-Feb-Mar', 'Apr-May-Jun', 'Jul-Aug-Sep', 'Oct-Nov-Dec'],
  options = [];
for (var pastYear = 2016; pastYear < y; pastYear++) {
  quarters.forEach(q => options.push(q + ' ' + pastYear));
}
quarters.slice(0, parseInt(m / 3 + 1)).forEach(q => options.push(q + ' ' + y));
console.log("current date: " + d);
console.log(options);

假设季度是 3 个月的部分,所以 1 月至 3 月是第 1 季度,4 月至 6 月是第 2 季度,依此类推,那么您可以简单地计算出开始日期的季度,然后继续添加 3 个月,直到您到达最后一个日期的季度。

季度可以表示为 yyyyQq,例如 2017 年 6 月 15 日是 2017Q2。然后计算季度只是:

Math.ceil(month/3)

function getQuarter(date) {
  return date.getFullYear() + 'Q' + Math.ceil((date.getMonth()+ 1)/3);
}
function listQuarters(sDate, eDate) {
  // Ensure start is the earlier date;
  if (sDate > eDate) {
    var t = eDate;
    eDate = sDate;
    sDate = t;
  }
  // Copy input start date do don't affect original
  sDate = new Date(sDate);
  
  // Set to 2nd of month so adding months doesn't roll over
  // and not affected by daylight saving
  sDate.setDate(2);
  // Initialise result array with start quarter
  var startQ = getQuarter(sDate);
  var endQ   = getQuarter(eDate);
  var result = [startQ];
  
  // List quarters from start to end
  while (startQ != endQ) {
    sDate.setMonth(sDate.getMonth() + 3);
    startQ = getQuarter(sDate);
    result.push(startQ);
  } 
  
  return result;
}
var start = new Date(2016,0,31);  // 31 Jan 2016
var end   = new Date();           // Today
console.log('Current quater: ' + getQuarter(end));
console.log('Quarter list  : ' + listQuarters(start, end));

创建开始日期和结束日期,循环增加开始日期,直到它等于结束日期,计算季度变化:

//A quarter is defined as a fourth of a year
function getQuarter(date) {
  return Math.floor(date.getMonth() / 3);
}
//A quartertimestamp adds the product quarters of the current year to the quartercount
function getQuarterTimestamp(date) {
  return getQuarter(date) + ":" + date.getFullYear();
}
//quartersTillNow calculates how many quarters in the past a date is
function quartersTillNow(origialFrom) {
  //From is a clone of origialFrom
  var from = new Date(origialFrom.getTime());
  //To is today
  var to = new Date();
  //Variable to count number of quarters between
  var quarters = 0;
  //While from is in the past, add month to from
  while (getQuarterTimestamp(from) != getQuarterTimestamp(to)) {
    //newFrom is defined as a clone of from
    var newFrom = new Date(from.getTime());
    //Add a month
    newFrom.setMonth(newFrom.getMonth() + 1);
    //If quarter has changed
    if (getQuarter(newFrom) != getQuarter(from)) {
      //Add a quarter
      quarters++;
    }
    //overwrite from and keep repeat
    from = newFrom;
  }
  //return count of quarters
  return quarters;
}
//TEST
var from = new Date();
from.setFullYear(2000);
console.log(from, "was", quartersTillNow(from), "quarters ago");

这是一个解决方案,它不会遍历每个日期,只是按程序将季度添加到当前季度,但不包括当前季度。

function listQuarters(sDate, eDate) {
    //Get the quarter of the current month
    var sQuarter = Math.floor((sDate.getMonth()-1)/3)+1;
    var eQuarter = Math.floor((eDate.getMonth()-1)/3)+1;
    var sYear = sDate.getYear();
    var eYear = eDate.getYear();
    var quarterNames = ['Jan-Feb-Mar', 'Apr-May-Jun', 'Jul-Aug-Sep', 'Oct-Nov-Dec'];
    var quarterList = [];
    while(sQuarter != eQuarter && sYear != eYear) {
        quarterList.push(sYear + ' Q' + quarterNames[sQuarter-1]);
        sQuarter++;
        if(sQuarter > 4) {
            sQuarter = 1;
            sYear++;
        }
    }
    return quarterList;
}

最新更新