首页 > 解决方案 > Javascript计算季节

问题描述

我环顾 Stack 并找到了一些其他从 Date 计算季节的示例,但如果传递了数千个 Date 对象,我不确定性能。另一个 Stack 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"

它有效,但我正在寻找有关如何使其更简洁的建议,可能使用 ES6 方法或对象而不是数组,因为我仍在学习这些概念的曲线。

标签: javascriptarraysjavascript-objects

解决方案


经过大量的试验和错误,我能够使用 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"

对象数组填充了北半球的目标日期 Equinox 和 Solstice 天数。您必须针对南半球相应地调整数组。过滤器命令返回小于目标日期的对象日期,然后对数组的最后一个值进行切片,最后如果未定义,则返回一个静态值。我希望这对未来的搜索有所帮助。


推荐阅读