我有两个变量: 开始&结束 基本上我需要在这两个日期之间的每个完整年份创建一个数组。
我需要记录数组中每年的总提款量,但不知道如何开始为每个保单年度创建数组。
任何帮助都将不胜感激。
答案 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]
尽管标题没有说明,但问题作者提到了“这两个日期之间的每个完整年份” 。没有提到构成“完整”年份的确切定义,但这可以是:
已满12个月的年份
在这种情况下,应该始终删除第一项和最后一项:
.slice(1, -1)
// Which gives: [2015, 2016, 2017, 2018, 2019]
从开始日期起每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)
/* 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)
/* 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以获得组合中的实际年份。