javascript - 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 方法或对象而不是数组,因为我仍在学习这些概念的曲线。
解决方案
经过大量的试验和错误,我能够使用 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 天数。您必须针对南半球相应地调整数组。过滤器命令返回小于目标日期的对象日期,然后对数组的最后一个值进行切片,最后如果未定义,则返回一个静态值。我希望这对未来的搜索有所帮助。
推荐阅读
- java - 可运行的 JAR 工作但没有完成它的工作
- java - 转义特殊字符,如 Java 中的 +
- compression - Kakadu 和 JPEG-2000 标准 (JP3D) 的第 10 部分
- reactjs - reactjs/react-router-dom: Browserrouter 路由问题
- reactjs - 界面不能同时扩展类型锚和按钮
- flutter - 将 AdmobBanner 放在 Flutter 中 Column 的底部
- google-chrome - 如果我有 cookie 会话 ID,我可以直接通过浏览器登录网站吗?
- javascript - 构建时动态加载 JSON 文件
- ios - 为什么从 Nib 加载的 UITextField 的默认字体太小?
- python - Tensorflow 2.0:如何从 MapDataset(从 TFRecord 读取后)转换为可以输入到 model.fit 的某些结构