JS时间 - 在两个日期之间为每年制作一个数组

时间:2014-06-26 14:41:49

标签: javascript arrays time

我有两个变量:  开始&结束 基本上我需要在这两个日期之间的每个完整年份创建一个数组。

我需要记录数组中每年的总提款量,但不知道如何开始为每个保单年度创建数组。

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:2)

对于简单的情况(使用库可能会过分杀伤),我将使用以下方法:

const rangeOfYears = (start, end) => Array(end - start + 1)
  .fill(start)
  .map((year, index) => year + index)

如果输入的不是整数而是Date对象,请使用.getFullYear()


例如,如果我们想要 2014 2020 (含)之间的年份,则为:

// Using integers for years
rangeOfYears(2014, 2020)

// Using `Date` objects for years
rangeOfYears(new Date("Jun 26 2014").getFullYear(), new Date().getFullYear())

// For both the result would be:
// [2014, 2015, 2016, 2017, 2018, 2019, 2020]

尽管标题没有说明,但问题作者提到了“这两个日期之间的每个完整年份” 。没有提到构成“完整”年份的确切定义,但这可以是:

  1. 已满12个月的年份
    在这种情况下,应该始终删除第一项和最后一项:

    .slice(1, -1)
    // Which gives: [2015, 2016, 2017, 2018, 2019]
    
    
  2. 从开始日期起每12个月
    在这种情况下,需要使用过滤器来查看上一年是否在范围内:
    (这需要Date对象才能使用)

    .filter((year, index) => 
        // 31536000000 = 60 * 60 * 24 * 365 * 1000 = one year in milliseconds
        index < (end.getTime() - start.getTime()) / 31536000000)
        // Which gives: [2014, 2015, 2016, 2017, 2018, 2019]
    
    

代码示例

将所有这些放在一起可以得到:

没有“完整年份”过滤器

/* Example without "complete year" filter */
const rangeOfYears = (start, end) => Array(end - start + 1)
  .fill(start)
  .map((year, index) => year + index)

let a = rangeOfYears(2014, 2020)
let b = rangeOfYears(new Date("Jun 26 2014").getFullYear(), new Date().getFullYear())

console.log(a)
console.log(b)

使用“完整年份= 12个完整月份”过滤器

/* Example with "complete year = 12 full months" filter */
const rangeOfYears = (start, end) => Array(end - start + 1)
  .fill(start)
  .map((year, index) => year + index)
  .slice(1, -1)

let c = rangeOfYears(2014, 2020)
let d = rangeOfYears(new Date("Jun 26 2014").getFullYear(), new Date().getFullYear())

console.log(c)
console.log(d)

使用“完整年份=每12个月”过滤器

/* Example with "complete year = each 12 months" filter */
const rangeOfFullYears = (start, end) => {
  
  // Lets not do this inside the "filter"...
  const fullYears = (end.getTime() - start.getTime()) / 31536000000
  
  return Array(end.getFullYear() - start.getFullYear() + 1)
    .fill(start.getFullYear())
    .map((year, index) => year + index)
    .filter((year, index) => index < fullYears)
}

let e = rangeOfFullYears(new Date("Jun 26 2014"), new Date())

console.log(e)

答案 1 :(得分:1)

如果你做了很多日期操作,我建议使用Moment.js。使用Moment.js diff函数,Moment.js将对差异进行精确计算,而不只是减去Date对象上的year组件。

跨越2年的例子:

var Start = new Date("June 26, 2012 11:13:00");
var End = new Date("January 1, 2015 11:13:00");
var years = moment(End).diff(Start, 'years');
var yearsBetween = [];
for(var year = 0; year < years; year++)
    yearsBetween.push(Start.getFullYear() + year);

返回:

yearsBetween
[2012, 2013]

跨越3年的例子:

var Start = new Date("June 26, 2012 11:13:00");
var End = new Date("June 26, 2015 11:13:00");
var years = moment(End).diff(Start, 'years');
var yearsBetween = [];
for(var year = 0; year < years; year++)
    yearsBetween.push(Start.getFullYear() + year);

返回:

yearsBetween
[2012, 2013, 2014]

第一个例子仅跨越2年,因为它没有3年,即使结束年份比开始年份晚3年。超过开始日期的同一个月/日的任何东西都算作一整年。这就是为什么第二个例子跨越了整整3年。

答案 2 :(得分:0)

此函数采用开始日期对象和结束日期对象,并返回两个日期之间的年份数组。它不会为您处理任何错误。它只需要开始日期和结束日期,并期望它们是有效的日期对象,结束日期晚于开始日期。

var calculateYearsBetween = function(startDate, endDate) {
    var startYear = startDate.getYear() + 1900, //The start year
        endYear = endDate.getYear() + 1900,     //The end year
        output = []                             //Initialize the output

    // For each year between push that year into the output
    for ( var year = startYear; year <= endYear; year++ ) output.push(year)

    // Return the output
    return output
}

<强>用法

calculateYearsBetween( new Date("Jan 1 2012"), new Date() )

这是fiddle

答案 3 :(得分:-1)

所以我尝试了第一个解决方案,但我又得到了一个负数,所以for循环不会运行。这是我后来想出的解决方案:

export function yearsBetween() {
    const currentYear = moment();
    const backYear = new Date("January 1, 2015");
    const years = moment(backYear).diff(currentYear, 'years');
    const iterator = Math.abs(years) + 1;
    const yearsArray = [];

    for (var year = 0; year < iterator; year++) {
        console.log(currentYear.format("YYYY"))
        yearsArray.push(parseInt(currentYear.format("YYYY")) - year);
    }

    return yearsArray;
}

我所做的是使用Maths.abs()将其更改为正数,然后加1以获得组合中的实际年份。