rew*_*rew 1 javascript arrays javascript-objects
我环顾了 Stack 并找到了其他一些从 Date 计算季节的例子,但是如果它传递了数千个 Date 对象,我不确定性能。另一个堆栈 OP,有人建议将日期转换为时间,然后比较整数是最有效的,所以我编写了以下函数来计算过去日期的季节。
function season(d) {
day = new Date(d);
days = day.getTime();
const SPRING_START = new Date(day.getFullYear(), 2, (day.getFullYear() % 4 === 1) ? 19 : 20).getTime();
const SUMMER_START = new Date(day.getFullYear(), 5, (day.getFullYear() % 4 === 1) ? 20 : 21).getTime();
const AUTUMN_START = new Date(day.getFullYear(), 8, (day.getFullYear() % 4 === 1) ? 22 : 23).getTime();
const AUTUMN_END = new Date(day.getFullYear(), 11, (day.getFullYear() % 4 === 1) ? 20 : 21).getTime();
const s = [SPRING_START, SUMMER_START, AUTUMN_START, AUTUMN_END];
const S_NAME = ["Spring", "Summer", "Autumn", "Winter"];
for( i = 0; i < s.length - 1; i++ ) {
if(days >= s[i] && days < s[i + 1]) {
season = S_NAME[i];
break;
}
season = S_NAME[3];
}
return season;
}
document.write(season("8/1/2019"));
// "Summer"
Run Code Online (Sandbox Code Playgroud)
它有效,但我正在寻找有关如何使其更简洁的建议,也许使用 ES6 方法或对象而不是数组,因为我仍在学习这些概念。
经过大量的反复试验,我能够使用 ES6 方法回答我自己的问题:
const d = new Date("3/19/2020");
var seasonArray = [
{name: 'Spring', date: new Date(d.getFullYear(),2,(d.getFullYear() % 4 === 0) ? 19 : 20).getTime()},
{name: 'Summer', date: new Date(d.getFullYear(),5,(d.getFullYear() % 4 === 0) ? 20 : 21).getTime()},
{name: 'Autumn', date: new Date(d.getFullYear(),8,(d.getFullYear() % 4 === 0) ? 22 : 23).getTime()},
{name: 'Winter', date: new Date(d.getFullYear(),11,(d.getFullYear() % 4 === 0) ? 20 : 21).getTime()}
];
const season = seasonArray.filter(({ date }) => date <= d).slice(-1)[0] || {name: "Winter"}
console.log(new Date(d).toLocaleDateString(), season.name);
// "1/1/2019" "Winter"
// "3/19/2019" "Winter"
// "3/19/2020" "Spring"
// "11/25/2022" "Autumn"
// "12/31/2023" "Winter"
Run Code Online (Sandbox Code Playgroud)
对象数组填充有北半球的目标日期 Equinox 和 Solstice 天数。您必须针对南半球相应地调整数组。过滤器命令返回小于目标日期的对象日期,然后对数组的最后一个值进行切片,最后如果未定义,则返回一个静态值。我希望这有助于未来的搜索。