@gdjiami/jm-mrc-components
Version:
移动端可复用组件库
172 lines (171 loc) • 4.54 kB
JavaScript
import { __read } from "tslib";
import { solarToLunar } from 'chinese-lunar';
import memoize from 'lodash/memoize';
export var holidays = {
// 新历假日
gregorian: {
'1-1': '元旦',
'2-14': '情人节',
'3-8': '妇女节',
'5-1': '劳动节',
'5-4': '青年节',
'6-1': '儿童节',
'7-1': '建党节',
'8-1': '建军节',
'9-10': '教师节',
'10-1': '国庆节',
// 动态节日(节气都是动态节日,暂时不展示)
// '4-4': '清明节',
// '12-22': '冬至',
// '6-22': '夏至',
'12-25': '圣诞节',
},
lunar: {
'12-8': '腊八',
'12-29-leap': '除夕',
'12-30': '除夕',
'1-1': '春节',
'1-15': '元宵节',
'5-5': '端午节',
'7-7': '七夕',
'8-15': '中秋节',
'9-9': '重阳节',
},
byWeek: {
'5-2-0': '母亲节',
// 六月第三个星期日
'6-3-0': '父亲节',
},
};
/**
* 获取节假日
*/
export default function getHoliday(date) {
var gregorian = date.getMonth() + 1 + "-" + date.getDate();
if (gregorian in holidays.gregorian) {
return holidays.gregorian[gregorian];
}
// 动态节日
var dynamicHolidays = getDynamicHoliday(date.getFullYear());
if (gregorian in dynamicHolidays) {
return dynamicHolidays[gregorian];
}
for (var key in holidays.byWeek) {
var _a = __read(key.split('-').map(function (i) { return parseInt(i); }), 3), month = _a[0], week = _a[1], day = _a[2];
if (month !== date.getMonth() + 1) {
continue;
}
if (day !== date.getDay()) {
continue;
}
var holiday = getNthWeek(date, week, day);
if (holiday.getDate() === date.getDate()) {
return holidays.byWeek[key];
}
}
// 农历节假日
var lunar = solarToLunar(date);
var lunarKey = lunar.month + "-" + lunar.day;
if (lunar.leap && lunar.month === 12) {
lunarKey += '-leap';
}
return holidays.lunar[lunarKey];
}
export var getDynamicHoliday = memoize(function (year) {
var result = {};
try {
// const dongzhi = getDongzhiForYear(year)
// result[`12-${dongzhi}`] = '冬至'
var qingming = getQingMingForYear(year);
result["4-" + qingming] = '清明';
}
catch (_a) {
// ignore
}
return result;
});
export function getDongzhiForYear(year) {
if (year == 2767) {
return 23;
}
if (year == 2227 || year == 3068) {
return 22;
}
if (year < 1700) {
throw new TypeError('1700年以前暂时不支持');
}
if (year >= 3100) {
throw new TypeError('3100年以后暂时不支持');
}
var coefficient = [
22.11,
22.39,
22.66,
21.9,
22.18,
22.472,
22.72,
21.995,
22.27,
22.51,
22.75,
22.02,
22.27,
22.519,
22.8,
];
var mod = year % 100;
var index = Math.trunc(year / 100 - 17);
return Math.trunc(mod * 0.2422 + coefficient[index] - Math.trunc(mod / 4));
}
export function getQingMingForYear(year) {
if (year == 2231) {
return 23;
}
if (year == 2227 || year == 3068) {
return 22;
}
if (year < 1700) {
throw new TypeError('1700年以前暂时不支持');
}
if (year >= 3100) {
throw new TypeError('3100年以后暂时不支持');
}
var coefficient = [
5.15,
5.37,
5.59,
4.82,
5.02,
5.26,
5.48,
4.7,
4.92,
5.135,
5.36,
4.6,
4.81,
5.04,
5.26,
];
var mod = year % 100;
var index = Math.trunc(year / 100 - 17);
return Math.trunc(mod * 0.2422 + coefficient[index] - Math.trunc(mod / 4));
}
/**
* 获取当月第N个星期*
*/
export function getNthWeek(date, n, day) {
var copy = new Date(date);
copy.setDate(1);
var firstDay = copy.getDay();
// first week end
if (firstDay > day) {
copy.setDate(1 + 7 - (firstDay - day));
}
else {
copy.setDate(1 + (day - firstDay));
}
copy.setDate(copy.getDate() + (n - 1) * 7);
return copy;
}