上一篇讲了JavaScript公历转农历算法的实现,这篇再讲一下24节气的实现,24节气即:

        立春  雨水  惊蛰  春分  清明  谷雨  
        立夏  小满  芒种  夏至  小暑  大暑    
        立秋  处暑  白露  秋分  寒露  霜降  
        立冬  小雪  大雪  冬至  小寒  大寒

        24节气是中国人通过观察太阳周年运动,认知一年中时令、气候、物候等方面变化规律形成的知识体系和社会实践,是上古农耕文明的产物,千年以来指导着中国传统农业生产和日常生活,可以很好的反映气象变化和季节的更替,其实24节气算是一种阳历,是有规律可循的,计算它有相关的公示,下面还是直接上代码,很简单,都有注释,下面的代码可以计算任何21世纪年份的节气。

/**
 * 二十四节气
 */
class solarTerms{
	//取得某一年的节气(21世纪的年份)
	getSolarTermsByYear(year){
		let y=parseInt((""+year).substr(2,2));//年的后两位
		let data={};
		data.小寒=""+year+"-1-"+(Math.floor(y*0.2422+5.4055)-Math.floor(y/4));
		data.大寒=""+year+"-1-"+(Math.floor(y*0.2422+20.12)-Math.floor(y/4));
		data.立春=""+year+"-2-"+(Math.floor(y*0.2422+3.87)-Math.floor(y/4));
		data.雨水=""+year+"-2-"+(Math.floor(y*0.2422+18.73)-Math.floor(y/4));
		data.惊蛰=""+year+"-3-"+(Math.floor(y*0.2422+5.63)-Math.floor(y/4));
		data.春分=""+year+"-3-"+(Math.floor(y*0.2422+20.646)-Math.floor(y/4));
		data.清明=""+year+"-4-"+(Math.floor(y*0.2422+4.81)-Math.floor(y/4));
		data.谷雨=""+year+"-4-"+(Math.floor(y*0.2422+20.1)-Math.floor(y/4));
		data.立夏=""+year+"-5-"+(Math.floor(y*0.2422+5.52)-Math.floor(y/4));
		data.小满=""+year+"-5-"+(Math.floor(y*0.2422+21.04)-Math.floor(y/4));
		data.芒种=""+year+"-6-"+(Math.floor(y*0.2422+5.678)-Math.floor(y/4));
		data.夏至=""+year+"-6-"+(Math.floor(y*0.2422+21.37)-Math.floor(y/4));
		data.小暑=""+year+"-7-"+(Math.floor(y*0.2422+7.108)-Math.floor(y/4));
		data.大暑=""+year+"-7-"+(Math.floor(y*0.2422+22.83)-Math.floor(y/4));
		data.立秋=""+year+"-8-"+(Math.floor(y*0.2422+7.5)-Math.floor(y/4));
		data.处暑=""+year+"-8-"+(Math.floor(y*0.2422+23.13)-Math.floor(y/4));
		data.白露=""+year+"-9-"+(Math.floor(y*0.2422+7.646)-Math.floor(y/4));
		data.秋分=""+year+"-9-"+(Math.floor(y*0.2422+23.042)-Math.floor(y/4));
		data.寒露=""+year+"-10-"+(Math.floor(y*0.2422+8.318)-Math.floor(y/4));
		data.霜降=""+year+"-10-"+(Math.floor(y*0.2422+23.438)-Math.floor(y/4));
		data.立冬=""+year+"-11-"+(Math.floor(y*0.2422+7.438)-Math.floor(y/4));
		data.小雪=""+year+"-11-"+(Math.floor(y*0.2422+22.36)-Math.floor(y/4));
		data.大雪=""+year+"-12-"+(Math.floor(y*0.2422+7.18)-Math.floor(y/4));
		data.冬至=""+year+"-12-"+(Math.floor(y*0.2422+21.94)-Math.floor(y/4));
		return data;
	}
	//取得某一天的节气,不是节气则返回空字符串
	getSolarTermsByYmd(ymd){
		ymd=ymd.replaceAll("/","-");
		let y=ymd.split("-")[0];
		let data=this.getSolarTermsByYear(y);
		//键值对换
		data=Object.keys(data).reduce(function(newData,key){
			newData[data[key]]=key;
			return newData;
		},{});
		if(data.hasOwnProperty(ymd)){
			return data[ymd];
		}else{
			return "";
		}
	}
}

        使用方法也很简单,例如计算2023年的节气时间表,只需要

let SolarTerms=new solarTerms();
SolarTerms.getSolarTermsByYear(2023);

        结果如下:

小寒 -> 2023-1-5
大寒 -> 2023-1-20
立春 -> 2023-2-4
雨水 -> 2023-2-19
惊蛰 -> 2023-3-6
春分 -> 2023-3-21
清明 -> 2023-4-5
谷雨 -> 2023-4-20
立夏 -> 2023-5-6
小满 -> 2023-5-21
芒种 -> 2023-6-6
夏至 -> 2023-6-21
小暑 -> 2023-7-7
大暑 -> 2023-7-23
立秋 -> 2023-8-8
处暑 -> 2023-8-23
白露 -> 2023-9-8
秋分 -> 2023-9-23
寒露 -> 2023-10-8
霜降 -> 2023-10-24
立冬 -> 2023-11-8
小雪 -> 2023-11-22
大雪 -> 2023-12-7
冬至 -> 2023-12-22

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐