Javascript JS时间-在两个日期之间为每年创建一个数组

Javascript JS时间-在两个日期之间为每年创建一个数组,javascript,arrays,time,Javascript,Arrays,Time,我有两个变量: 开始和结束 基本上,我需要为这两个日期之间的每一年创建一个数组 我需要在数组中记录每年的取款总额,但不确定如何开始为每个保单年度创建数组 任何帮助都将不胜感激。此函数接受开始日期对象和结束日期对象,并返回两个日期之间的年份数组。它不会为您处理任何错误。它只接受开始日期和结束日期,并希望它们是有效的日期对象,结束日期晚于开始日期 var calculateYearsBetween = function(startDate, endDate) { var startYear

我有两个变量: 开始和结束 基本上,我需要为这两个日期之间的每一年创建一个数组

我需要在数组中记录每年的取款总额,但不确定如何开始为每个保单年度创建数组


任何帮助都将不胜感激。

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

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
}

这里有一个

如果你做了大量的日期操作,我建议你使用矩.js。使用Moment.js函数,Moment.js将对差异进行精确计算,而不仅仅是减去Date对象上的年份部分

跨越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);
跨越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);
第一个示例仅跨越2年,因为它没有3个完整的年份,即使结束年份比开始年份晚3年。在后一年中,任何超过开始日期的同一个月/日的内容都将被视为全年。这就是为什么第二个例子跨越了整整3年

编辑: 如何在不使用moment.js的情况下进行差异计算的示例:

const msPerYear = 1000 * 60 * 60 * 24 * 365;

function diffYear(d1, d2) {
  const utc1 = Date.UTC(d1.getFullYear(), d1.getMonth(), d1.getDate());
  const utc2 = Date.UTC(d2.getFullYear(), d2.getMonth(), d2.getDate());
  return Math.floor((utc2 - utc1) / msPerYear);
}
跨越7年:

var Start = new Date("June 26, 2012 11:13:00");
var End = new Date("January 1, 2020 11:13:00");

var diff = diffYear(Start, End);
返回:

yearsBetween
[2012, 2013]
yearsBetween
[2012, 2013, 2014]
7
8
跨越8年:

var Start = new Date("June 26, 2012 11:13:00");
var End = new Date("June 26, 2020 11:13:00");

var diff = diffYear(Start, End);
返回:

yearsBetween
[2012, 2013]
yearsBetween
[2012, 2013, 2014]
7
8

注意:使用闰年计算差异时会变得复杂,因为它们只改变闰年中每年的毫秒数。

因此我尝试了第一种解决方案,并得到了一个负数,因此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;
}
导出函数年份介于()之间{
常数当前年=力矩();
const backYear=新日期(“2015年1月1日”);
常数年=时刻(回溯年).diff(当前年,'年');
常量迭代器=Math.abs(年)+1;
常量年数组=[];
对于(变量年=0;年<迭代器;年++){
console.log(当前年份格式(“YYYY”))
yearsArray.push(parseInt(currentYear.format(“YYYY”))-year);
}
回归年报;
}
我所做的是使用math.abs()将其改为正数,然后再加上1以得到组合中的实际年份。

对于简单的场景(使用库可能会过度使用),我会使用以下方法:

const rangeOfYears=(开始,结束)=>Array(结束-开始+1)
.填充(开始)
.map((年,指数)=>年+指数)
如果您的输入不是整数而是日期对象,请使用
.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]
虽然标题没有说明这一点,但问题作者提到“这两个日期之间的每一整年”。没有提及“完整”年份的确切定义,但可以是:

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

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

    .filter((年份,索引)=>
    //31536000000=60*60*24*365*1000=一年(毫秒)
    索引<(end.getTime()-start.getTime())/31536000000)
    //其中给出:[2014、2015、2016、2017、2018、2019]
    

  • 代码示例 把所有这些放在一起,我们可以:

    没有“完整年份”过滤器
    /*不带“完整年份”过滤器的示例*/
    常量rangeOfYears=(开始,结束)=>数组(结束-开始+1)
    .填充(开始)
    .map((年,指数)=>年+指数)
    设a=年数范围(2014年、2020年)
    设b=rangeOfYears(新日期(“2014年6月26日”).getFullYear(),新日期().getFullYear())
    控制台日志(a)
    
    console.log(b)
    什么是
    开始
    结束
    ?日期对象?字符串?我们可以看一些您尝试过的代码吗?您需要如何处理您创建的数组?用记录填充它们,并将它们存储在何处?这会起作用,但它只获取日期对象的年份部分,而不考虑完整年份是否在两个日期之间。OP要求在
    开始
    结束
    日期之间的完整年份。这就是为什么使用一个库或函数来计算两个日期之间的差异可能是首选的原因。对我来说,“一整年”的定义似乎相当模糊。。。为了解释我的意思,我将用“2014年6月26日”作为开始日期,今天(2020年5月12日)作为结束日期我是否应该包括2014年,不包括2020年(因为从2014-06-26到2015-06-26有一整年,但不是从2019-06-26到2020-06-26)?或者我应该将2014年和2020年都排除在外(因为两者都没有整整12个月)?@CameronTinker我已经更新了我的答案,以反映您评论中的见解。是的,“全年”的概念是模糊的,但这看起来很好地解决了全年的日期范围。我唯一的建议是使用UTC日期,因为它们不受时区时间变化的影响。这是一个很好的干净更新!