@sanguogege/calendar 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,160 +0,0 @@
1
- import {
2
- LunarInfo,
3
- Gan,
4
- Zhi,
5
- GanZhiHour,
6
- SolarTerm,
7
- nStr3,
8
- nStr2,
9
- nStr1,
10
- } from "../data/Calendar";
11
-
12
- /**
13
- * 返回农历y年一整年的总天数
14
- * @param lunar Year
15
- * @return Number
16
- * @eg:var count = calendar.lYearDays(1987) ;//count=387
17
- */
18
- const lYearDays = function (y: number): number {
19
- let i,
20
- sum: number = 348;
21
- for (i = 0x8000; i > 0x8; i >>= 1) {
22
- sum += LunarInfo[y - 1900] & i ? 1 : 0;
23
- }
24
- return sum + leapDays(y);
25
- };
26
-
27
- /**
28
- * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0
29
- * @param lunar Year
30
- * @return Number (0-12)
31
- * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6
32
- */
33
- const leapMonth = function (y: number) {
34
- //闰字编码 \u95f0
35
- return LunarInfo[y - 1900] & 0xf;
36
- };
37
-
38
- /**
39
- * 返回农历y年闰月的天数 若该年没有闰月则返回0
40
- * @param lunar Year
41
- * @return Number (0、29、30)
42
- * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29
43
- */
44
- const leapDays = function (y: number): number {
45
- if (leapMonth(y)) {
46
- return LunarInfo[y - 1900] & 0x10000 ? 30 : 29;
47
- }
48
- return 0;
49
- };
50
-
51
- /**
52
- * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法
53
- * @param lunar Year
54
- * @return Number (-1、29、30)
55
- * @eg:var MonthDay = calendar.lMonthDays(1987,9) ;//MonthDay=29
56
- */
57
- const lMonthDays = function (y: number, m: number): number {
58
- if (m > 12 || m < 1) {
59
- return -1;
60
- } //月份参数从1至12,参数错误返回-1
61
- return LunarInfo[y - 1900] & (0x10000 >> m) ? 30 : 29;
62
- };
63
-
64
- /**
65
- * 农历年份转换为干支纪年
66
- * @param lYear 农历年的年份数
67
- * @return Cn string
68
- */
69
- const toGanZhiYear = function (lYear: number): string {
70
- let ganKey: number = (lYear - 3) % 10;
71
- let zhiKey: number = (lYear - 3) % 12;
72
- if (ganKey == 0) ganKey = 10; //如果余数为0则为最后一个天干
73
- if (zhiKey == 0) zhiKey = 12; //如果余数为0则为最后一个地支
74
- return Gan[ganKey - 1] + Zhi[zhiKey - 1];
75
- };
76
-
77
- /**
78
- * 传入offset偏移量返回干支
79
- * @param offset 相对甲子的偏移量
80
- * @return Cn string
81
- */
82
- const toGanZhi = function (offset: number): string {
83
- return Gan[offset % 10] + Zhi[offset % 12];
84
- };
85
-
86
- /**
87
- * 传入offset偏移量返回干支
88
- * @param offset 相对甲子的偏移量
89
- * @return Cn string
90
- */
91
- const toHourGanZhi = function (offset: number) {
92
- var gzDtr = GanZhiHour[offset % 10];
93
- return gzDtr.split("-");
94
- };
95
-
96
- /**
97
- * 传入农历数字月份返回汉语通俗表示法
98
- * @param lunar month
99
- * @return Cn string
100
- * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月'
101
- */
102
- const toChinaMonth = function (m: number): any {
103
- // 月 \u6708
104
- if (m > 12 || m < 1) {
105
- return -1;
106
- } //若参数错误 返回-1
107
- let s: string = nStr3[m - 1];
108
- s += "\u6708"; //加上月字
109
- return s;
110
- };
111
- /**
112
- * 传入农历日期数字返回汉字表示法
113
- * @param lunar day
114
- * @return Cn string
115
- * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一'
116
- */
117
- const toChinaDay = function (d: number): string {
118
- //日 \u65e5
119
- var s: string;
120
- switch (d) {
121
- case 10:
122
- s = "\u521d\u5341";
123
- break;
124
- case 20:
125
- s = "\u4e8c\u5341";
126
- break;
127
- break;
128
- case 30:
129
- s = "\u4e09\u5341";
130
- break;
131
- break;
132
- default:
133
- s = nStr2[Math.floor(d / 10)];
134
- s += nStr1[d % 10];
135
- }
136
- return s;
137
- };
138
-
139
- /**
140
- * 获取24节气的方法
141
- * @param number
142
- * @return Cn string
143
- * @eg:
144
- */
145
- const getSolarTerm = (n: number) => {
146
- return SolarTerm[n];
147
- };
148
-
149
- export {
150
- lYearDays,
151
- leapMonth,
152
- leapDays,
153
- lMonthDays,
154
- toGanZhiYear,
155
- toGanZhi,
156
- toHourGanZhi,
157
- toChinaMonth,
158
- toChinaDay,
159
- getSolarTerm,
160
- };
@@ -1,62 +0,0 @@
1
- import Fastival from "../data/fastival.json";
2
-
3
- function check(newData: any, old: any) {
4
- Object.keys(newData).forEach(function (e: any) {
5
- if (Array.isArray(newData[e])) {
6
- newData[e].forEach((et: any) => {
7
- if (typeof et !== "string") {
8
- console.error("节日名称应为String", et);
9
- }
10
- });
11
- if (!old.hasOwnProperty(e)) {
12
- old[e] = newData[e];
13
- } else {
14
- const newFes = old[e].concat(newData[e]);
15
- old[e] = newFes.filter(function (
16
- item: any,
17
- index: any,
18
- array: any
19
- ) {
20
- return array.indexOf(item) === index;
21
- });
22
- }
23
- } else {
24
- console.error("节日汇总格式是应为数组", newData);
25
- }
26
- });
27
- return old;
28
- }
29
-
30
- const FestivalDay = function (m: number, d: number, data: any, type = true) {
31
- const day =
32
- (m < 10 ? "0" + m : m.toString()) + (d < 10 ? "0" + d : d.toString());
33
-
34
- let FDays: any = {};
35
-
36
- if (type) {
37
- if (data.sFtv) {
38
- FDays = check(data.sFtv, Fastival.sFtv);
39
- } else {
40
- FDays = Fastival.sFtv;
41
- }
42
- } else {
43
- if (data.lFtv) {
44
- FDays = check(data.lFtv, Fastival.lFtv);
45
- } else {
46
- FDays = Fastival.lFtv;
47
- }
48
- }
49
- if (FDays[day]) {
50
- return {
51
- Festival: FDays,
52
- FDays: FDays[day],
53
- };
54
- } else {
55
- return {
56
- Festival: FDays,
57
- FDays: null,
58
- };
59
- }
60
- };
61
-
62
- export { FestivalDay };
@@ -1,50 +0,0 @@
1
- import Rest from "../data/rest.json";
2
-
3
- function check(data: any) {
4
- var demo = {
5
- 2023: {
6
- xiu: ["0101"],
7
- ban: ["0202", "0303"],
8
- },
9
- };
10
- Object.keys(data).forEach(function (e: any) {
11
- console.log(data);
12
- if (typeof e == "string") {
13
- if (!parseInt(e)) {
14
- console.error(
15
- "请检查输入的key是否正确:key应为number或者可被转换的string",
16
- demo
17
- );
18
- console.error("当前key为", e);
19
- }
20
- }
21
- if (!data[e].xiu) {
22
- console.error("请检查输入的休息的key格式是否正确:key应为xiu", demo);
23
- }
24
- if (!data[e].ban) {
25
- console.error("请检查输入的调休的key格式是否正确:ban", demo);
26
- }
27
- });
28
- return Object.assign({}, Rest, data);
29
- }
30
-
31
- const RestDay = function (y: number, m: number, d: number, data?: any) {
32
- var newRest = check(data);
33
- const day =
34
- (m < 10 ? "0" + m : m.toString()) + (d < 10 ? "0" + d : d.toString());
35
- if (newRest[y]) {
36
- return {
37
- Xiu: newRest[y].xiu.includes(day),
38
- Ban: newRest[y].ban.includes(day),
39
- newRest: newRest,
40
- };
41
- } else {
42
- return {
43
- Xiu: false,
44
- Ban: false,
45
- newRest: newRest,
46
- };
47
- }
48
- };
49
-
50
- export { RestDay };
@@ -1,129 +0,0 @@
1
- import { Animals, nStr1, SolarMonth, TermInfo } from "../data/Calendar";
2
-
3
- /**
4
- * 返回公历(!)y年m月的天数
5
- * @param solar Year
6
- * @return Number (-1、28、29、30、31)
7
- * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30//月份参数从1至12,参数错误返回-1
8
- */
9
- const solarDays = function (y: number, m: number): number {
10
- if (m > 12 || m < 1) {
11
- console.error("月份参数为1至12");
12
- return -1;
13
- }
14
- let ms: number = m - 1;
15
- if (ms == 1) {
16
- //2月份的闰平规律测算后确认返回28或29
17
- return (y % 4 == 0 && y % 100 != 0) || y % 400 == 0 ? 29 : 28;
18
- } else {
19
- return SolarMonth[ms];
20
- }
21
- };
22
-
23
- /**
24
- * 返回公历(!)y年m月的第一天是星期几
25
- * @param solar Year
26
- * @return Number (-1、28、29、30、31)
27
- * @eg:var solarFirstWeek = calendar.solarFirstWeek(1987,1) ;//星期四
28
- */
29
- const solarFirstWeek = function (y: number, m: number): number {
30
- if (m > 12 || m < 1) {
31
- console.error("月份参数为1至12");
32
- return -1;
33
- }
34
- let ms = m - 1;
35
- let solarDate = new Date(y, ms, 1, 0, 0, 0, 0);
36
- return solarDate.getDay();
37
- };
38
-
39
- /**
40
- * 公历月、日判断所属星座
41
- * @param m [公历月]
42
- * @param d [公历日]
43
- * @return Cn string
44
- */
45
- const toAstro = function (m: number, d: number): string {
46
- let s: string =
47
- "\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf";
48
- let arr: number[] = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22];
49
- return s.substr(m * 2 - (d < arr[m - 1] ? 2 : 0), 2) + "\u5ea7"; //座
50
- };
51
-
52
- /**
53
- * 传入公历(!)y年获得该年第n个节气的公历日期
54
- * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起
55
- * @return day Number
56
- * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春
57
- */
58
- const getTerm = function (y: number, n: number): number {
59
- if (y < 1900 || y > 2100) {
60
- return -1;
61
- }
62
- if (n < 1 || n > 24) {
63
- return -1;
64
- }
65
- let _table: string = TermInfo[y - 1900];
66
- let _info: Array<string> = [
67
- parseInt("0x" + _table.substr(0, 5)).toString(),
68
- parseInt("0x" + _table.substr(5, 5)).toString(),
69
- parseInt("0x" + _table.substr(10, 5)).toString(),
70
- parseInt("0x" + _table.substr(15, 5)).toString(),
71
- parseInt("0x" + _table.substr(20, 5)).toString(),
72
- parseInt("0x" + _table.substr(25, 5)).toString(),
73
- ];
74
- var _calday: Array<string> = [
75
- _info[0].substr(0, 1),
76
- _info[0].substr(1, 2),
77
- _info[0].substr(3, 1),
78
- _info[0].substr(4, 2),
79
-
80
- _info[1].substr(0, 1),
81
- _info[1].substr(1, 2),
82
- _info[1].substr(3, 1),
83
- _info[1].substr(4, 2),
84
-
85
- _info[2].substr(0, 1),
86
- _info[2].substr(1, 2),
87
- _info[2].substr(3, 1),
88
- _info[2].substr(4, 2),
89
-
90
- _info[3].substr(0, 1),
91
- _info[3].substr(1, 2),
92
- _info[3].substr(3, 1),
93
- _info[3].substr(4, 2),
94
-
95
- _info[4].substr(0, 1),
96
- _info[4].substr(1, 2),
97
- _info[4].substr(3, 1),
98
- _info[4].substr(4, 2),
99
-
100
- _info[5].substr(0, 1),
101
- _info[5].substr(1, 2),
102
- _info[5].substr(3, 1),
103
- _info[5].substr(4, 2),
104
- ];
105
- return parseInt(_calday[n - 1]);
106
- };
107
-
108
- /**
109
- * 年份转生肖[!仅能大致转换] 精确划分生肖分界线是“立春”
110
- * @param y year
111
- * @return Cn string
112
- * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔'
113
- */
114
- const getAnimal = function (y: number): string {
115
- return Animals[(y - 4) % 12];
116
- };
117
-
118
- /**
119
- * 数字转中文
120
- * @param number
121
- * @return Cn string
122
- * @eg:var sr = calendar.getAnimal(1987) ;//animal='兔'
123
- */
124
-
125
- const toChinaNum = (num: number) => {
126
- return nStr1[num];
127
- };
128
-
129
- export { solarDays, toChinaNum, solarFirstWeek, toAstro, getTerm, getAnimal };
@@ -1,261 +0,0 @@
1
- import {
2
- lYearDays,
3
- leapMonth,
4
- leapDays,
5
- lMonthDays,
6
- toGanZhiYear,
7
- toGanZhi,
8
- toHourGanZhi,
9
- toChinaMonth,
10
- toChinaDay,
11
- getSolarTerm,
12
- } from "./LunarFunction";
13
-
14
- import {
15
- toAstro,
16
- getTerm,
17
- getAnimal,
18
- solarDays,
19
- solarFirstWeek,
20
- toChinaNum,
21
- } from "./SolarFunction";
22
-
23
- import { RestDay } from "./SetRest";
24
- import { FestivalDay } from "./SetFestival";
25
-
26
- const solar2lunar = function (y: number, m: number, d: number): object {
27
- //未传参获得当天
28
- let objDate: Date;
29
- if (!y) {
30
- objDate = new Date();
31
- } else {
32
- objDate = new Date(y, m - 1, d);
33
- }
34
- let i: number,
35
- leap: number = 0,
36
- temp: number = 0;
37
- //修正ymd参数
38
- (y = objDate.getFullYear()),
39
- (m = objDate.getMonth() + 1),
40
- (d = objDate.getDate());
41
- let offset: number =
42
- (Date.UTC(
43
- objDate.getFullYear(),
44
- objDate.getMonth(),
45
- objDate.getDate()
46
- ) -
47
- Date.UTC(1900, 0, 31)) /
48
- 86400000;
49
- for (i = 1900; i < 2101 && offset > 0; i++) {
50
- temp = lYearDays(i);
51
- offset -= temp;
52
- }
53
- if (offset < 0) {
54
- offset += temp;
55
- i--;
56
- }
57
-
58
- //是否今天
59
- let isTodayObj: Date = new Date(),
60
- isToday: boolean = false;
61
- if (
62
- isTodayObj.getFullYear() == y &&
63
- isTodayObj.getMonth() + 1 == m &&
64
- isTodayObj.getDate() == d
65
- ) {
66
- isToday = true;
67
- }
68
- //星期几
69
- var nWeek: number = objDate.getDay(),
70
- cWeek: string = toChinaNum(nWeek);
71
- //数字表示周几顺应天朝周一开始的惯例
72
- if (nWeek == 0) {
73
- nWeek = 7;
74
- }
75
- //农历年
76
- let year: number = i;
77
- leap = leapMonth(i); //闰哪个月
78
- let isLeap = false;
79
-
80
- //效验闰月
81
- for (i = 1; i < 13 && offset > 0; i++) {
82
- //闰月
83
- if (leap > 0 && i == leap + 1 && isLeap == false) {
84
- --i;
85
- isLeap = true;
86
- temp = leapDays(year); //计算农历闰月天数
87
- } else {
88
- temp = lMonthDays(year, i); //计算农历普通月天数
89
- }
90
- //解除闰月
91
- if (isLeap == true && i == leap + 1) {
92
- isLeap = false;
93
- }
94
- offset -= temp;
95
- }
96
- // 闰月导致数组下标重叠取反
97
- if (offset == 0 && leap > 0 && i == leap + 1) {
98
- if (isLeap) {
99
- isLeap = false;
100
- } else {
101
- isLeap = true;
102
- --i;
103
- }
104
- }
105
- if (offset < 0) {
106
- offset += temp;
107
- --i;
108
- }
109
- //农历月
110
- let month: number = i;
111
- //农历日
112
- let day: number = offset + 1;
113
- //天干地支处理
114
- let sm: number = m - 1;
115
- let gzY: string = toGanZhiYear(year);
116
-
117
- // 当月的两个节气
118
- let firstNode: number = getTerm(y, m * 2 - 1); //返回当月「节」为几日开始
119
- let secondNode: number = getTerm(y, m * 2); //返回当月「节」为几日开始
120
-
121
- // 依据12节气修正干支月
122
- let gzM: string = toGanZhi((y - 1900) * 12 + m + 11);
123
- if (d >= firstNode) {
124
- gzM = toGanZhi((y - 1900) * 12 + m + 12);
125
- }
126
-
127
- //传入的日期的节气与否,有则值,没有则为null
128
- let Term: any = null;
129
- if (firstNode == d) {
130
- Term = getSolarTerm(m * 2 - 2);
131
- }
132
- if (secondNode == d) {
133
- Term = getSolarTerm(m * 2 - 1);
134
- }
135
- //日柱 当月一日与 1900/1/1 相差天数
136
- let dayCyclical: number =
137
- Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10;
138
- let gzD: string = toGanZhi(dayCyclical + d - 1);
139
-
140
- // 二十四小时对应的天干地支
141
- let gzH = toHourGanZhi(dayCyclical + d - 1);
142
-
143
- //该日期所属的星座
144
- let astro: string = toAstro(m, d);
145
- // 设置公里节日
146
- const GAll = FestivalDay(m, d, calendar.setFestival);
147
- const NAll = FestivalDay(month, day, calendar.setFestival, false);
148
- let Gljr = GAll.FDays;
149
- let Nljr = NAll.FDays;
150
- calendar.Festival = {
151
- sFtv: GAll.Festival,
152
- lFtv: NAll.Festival,
153
- };
154
- let XiuBox = RestDay(y, m, d, calendar.setRest);
155
- calendar.Rest = XiuBox.newRest;
156
- // 用于设置上个月
157
- return {
158
- Xiu: XiuBox.Xiu,
159
- Ban: XiuBox.Ban,
160
- Gljr: Gljr,
161
- Nljr: Nljr,
162
- lYear: year,
163
- lMonth: month,
164
- lDay: day,
165
- Animal: getAnimal(year),
166
- LMonthCn: (isLeap ? "\u95f0" : "") + toChinaMonth(month),
167
- LDayCn: toChinaDay(day),
168
- cYear: y,
169
- cMonth: m,
170
- cDay: d,
171
- gzYear: gzY,
172
- gzMonth: gzM,
173
- gzDay: gzD,
174
- gzHour: gzH,
175
- isToday: isToday,
176
- isLeap: isLeap,
177
- nWeek: nWeek,
178
- ncWeek: "\u661f\u671f" + cWeek,
179
- Term: Term,
180
- astro: astro,
181
- };
182
- };
183
-
184
- const lunar2solar = function (
185
- y: number,
186
- m: number,
187
- d: number,
188
- isLeapMonth: boolean
189
- ): any {
190
- //参数区间1900.1.31~2100.12.1
191
- isLeapMonth = !!isLeapMonth;
192
- let leapM: any = leapMonth(y);
193
- if (isLeapMonth && leapM != m) {
194
- return -1;
195
- } //传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同
196
- if ((y == 2100 && m == 12 && d > 1) || (y == 1900 && m == 1 && d < 31)) {
197
- return -1;
198
- } //超出了最大极限值
199
- let day: number = lMonthDays(y, m);
200
- let _day: number = day;
201
- //bugFix 2016-9-25
202
- //if month is leap, _day use leapDays method
203
- if (isLeapMonth) {
204
- _day = leapDays(y);
205
- }
206
- if (y < 1900 || y > 2100 || d > _day) {
207
- return -1;
208
- } //参数合法性效验
209
-
210
- //计算农历的时间差
211
- let offset: number = 0;
212
- for (let i = 1900; i < y; i++) {
213
- offset += lYearDays(i);
214
- }
215
- let leap: number = 0,
216
- isAdd: boolean = false;
217
- for (let i = 1; i < m; i++) {
218
- leap = leapMonth(y);
219
- if (!isAdd) {
220
- //处理闰月
221
- if (leap <= i && leap > 0) {
222
- offset += leapDays(y);
223
- isAdd = true;
224
- }
225
- }
226
- offset += lMonthDays(y, i);
227
- }
228
- //转换闰月农历 需补充该年闰月的前一个月的时差
229
- if (isLeapMonth) {
230
- offset += day;
231
- }
232
- //1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点)
233
- let stmap: number = Date.UTC(1900, 1, 30, 0, 0, 0);
234
- let calObj: Date = new Date((offset + d - 31) * 86400000 + stmap);
235
- let cY: number = calObj.getUTCFullYear();
236
- let cM: number = calObj.getUTCMonth() + 1;
237
- let cD: number = calObj.getUTCDate();
238
-
239
- return solar2lunar(cY, cM, cD);
240
- };
241
-
242
- const calendar = {
243
- setRest: {},
244
- Rest: {},
245
- setFestival: {},
246
- Festival: {},
247
- lYearDays,
248
- leapMonth,
249
- leapDays,
250
- lMonthDays,
251
- toChinaMonth,
252
- toChinaDay,
253
- solarDays,
254
- solarFirstWeek,
255
- toAstro,
256
- getAnimal,
257
- solar2lunar,
258
- lunar2solar,
259
- };
260
-
261
- export default calendar;
package/tsconfig.json DELETED
@@ -1,23 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2020",
4
- "useDefineForClassFields": true,
5
- "module": "ESNext",
6
- "lib": ["ES2020", "DOM", "DOM.Iterable"],
7
- "skipLibCheck": true,
8
-
9
- /* Bundler mode */
10
- "moduleResolution": "bundler",
11
- "allowImportingTsExtensions": true,
12
- "resolveJsonModule": true,
13
- "isolatedModules": true,
14
- "noEmit": true,
15
-
16
- /* Linting */
17
- "strict": true,
18
- "noUnusedLocals": true,
19
- "noUnusedParameters": true,
20
- "noFallthroughCasesInSwitch": true
21
- },
22
- "include": ["src"]
23
- }
package/vite.config.js DELETED
@@ -1,14 +0,0 @@
1
- // vite.config.js
2
- import { resolve } from 'path'
3
- import { defineConfig } from 'vite'
4
-
5
- export default defineConfig({
6
- build: {
7
- lib: {
8
- entry: resolve(__dirname, 'src/core/index.ts'),
9
- name: 'calendar',
10
- // the proper extensions will be added
11
- fileName: 'index',
12
- },
13
- },
14
- })