chinese-days
Version:
中国节假日、调休日、工作日、24节气查询,农历阳历互转,支持 TS、CommonJS、UMD 模块化使用,提供 ics 日历格式,可供 Google Calendar、Apple Calendar、Microsoft Outlook 等客户端订阅。
135 lines (130 loc) • 3.49 kB
text/typescript
import { getLunarDate, monthDays } from '../solar_lunar';
import { getSolarTermsInRange } from '../solar_terms';
import { type Dayjs } from '../utils/dayjs';
// 特殊节日处理器类型
export interface LunarFestival {
date: string; // 节日日期(公历)
name: string; // 节日名称
type: 'lunar' | 'solar_term' | 'special';
}
// 固定农历节日配置
export const LUNAR_FESTIVAL_MAP: Record<number, Record<number, string[]>> = {
1: {
// 正月
1: ['春节', '鸡日', '元始天尊诞辰'],
2: ['犬日'],
3: ['猪日', '小年朝'],
4: ['羊日', '孙天医诞辰'],
5: ['牛日', '破五日', '开市', '路神诞辰'],
6: ['马日'],
7: ['人日', '送火神'],
8: ['谷日', '阎王诞辰'],
9: ['天日', '玉皇诞辰'],
10: ['地日', '石头生日'],
13: ['上(试)灯日', '关公升天日'],
15: ['元宵节', '上元节', '正灯日', '天官诞辰'],
18: ['落灯日'],
25: ['天仓(填仓)节'],
},
2: {
// 二月
1: ['太阳生日'],
2: ['春龙节', '土地公生日', '济公活佛生日'],
3: ['文昌帝君诞辰'],
12: ['百花生日(花朝节)'],
15: ['九天玄女诞辰', '太上老君诞辰', '精忠岳王诞辰'],
19: ['观音菩萨诞辰'],
21: ['普贤菩萨诞辰'],
},
3: {
3: ['上巳节'],
15: ['赵公元帅诞辰', '泰山老母诞辰'],
},
4: {
1: ['祭雹神'],
4: ['文殊菩萨诞辰'],
8: ['浴佛节(龙华会)'],
12: ['蛇王诞辰'],
14: ['吕洞宾诞辰'],
18: ['华佗诞辰'],
28: ['药王(神农)诞辰'],
},
5: {
5: ['端午节'],
13: ['雨节', '黄帝诞辰'],
},
6: {
1: ['半年节'],
6: ['晒衣节'],
19: ['观音菩萨得道'],
24: ['雷神诞辰', '荷花生日', '关公诞辰'],
},
7: {
1: ['祭海神'],
7: ['乞巧节'],
15: ['中元(鬼)节', '地官诞辰(孟兰盆会)'],
18: ['西王母诞辰'],
20: ['棉花生日'],
23: ['诸葛亮诞辰'],
30: ['地藏菩萨诞辰'],
},
8: {
1: ['天医节'],
3: ['灶君生日'],
8: ['瑶池大会'],
15: ['中秋节'],
20: ['水稻生日'],
28: ['孔子诞辰'],
},
9: {
9: ['重阳节'],
19: ['观音菩萨出家'],
},
10: {
1: ['十月朝', '寒衣节'],
15: ['下元节', '水官诞辰'],
},
12: {
8: ['腊八节'],
23: ['官家送灶'],
24: ['民间送灶'],
25: ['接玉皇'],
},
};
// 特殊节日处理器
export const SPECIAL_FESTIVAL_HANDLERS: ((
date: Dayjs,
result: LunarFestival[]
) => void)[] = [
// 处理寒食节(清明前一日)
(current, result) => {
const pureBrightnessDay = current.add(1, 'day');
const pureBrightness = getSolarTermsInRange(pureBrightnessDay).find(
t => t.term === 'pure_brightness'
);
if (pureBrightness) {
result.push({
date: current.format('YYYY-MM-DD'),
name: '寒食节',
type: 'solar_term',
});
}
},
// 处理除夕(农历腊月最后一日)
(current, result) => {
const lunar = getLunarDate(current);
if (
lunar.lunarMon === 12 &&
lunar.lunarDay === monthDays(lunar.lunarYear, 12)
) {
const date = current.format('YYYY-MM-DD');
['除夕', '封井', '祭井神', '贴春联', '迎财神'].forEach(name => {
result.push({
date,
name,
type: 'lunar',
});
});
}
},
];