@momo-kits/calendar 0.0.48-rc.2 → 0.0.48
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.
- package/CalendarPro.tsx +390 -0
- package/Day.tsx +220 -0
- package/HeaderControl.tsx +55 -0
- package/LunarDateConverter.ts +214 -0
- package/{src/LunarService.js → LunarService.ts} +85 -64
- package/Month.tsx +114 -0
- package/MonthList.tsx +282 -0
- package/TabHeader.tsx +90 -0
- package/Util.ts +293 -0
- package/holidayData.ts +125 -0
- package/index.tsx +479 -0
- package/package.json +18 -17
- package/publish.sh +17 -23
- package/styles.ts +127 -0
- package/types.ts +200 -0
- package/index.js +0 -4
- package/src/Calendar.js +0 -394
- package/src/CalendarPro.js +0 -363
- package/src/Day/index.js +0 -210
- package/src/Day/style.js +0 -129
- package/src/HeaderControl.js +0 -79
- package/src/LunarDateConverter.js +0 -191
- package/src/Month/index.js +0 -80
- package/src/Month/style.js +0 -0
- package/src/MonthList.js +0 -254
- package/src/TabHeader.js +0 -79
- package/src/Util.js +0 -225
- package/src/calendarPicker/Day.js +0 -154
- package/src/calendarPicker/Days.js +0 -203
- package/src/calendarPicker/HeaderControls.js +0 -158
- package/src/calendarPicker/WeekDaysLabels.js +0 -22
- package/src/calendarPicker/index.js +0 -125
- package/src/calendarPicker/styles.js +0 -184
- package/src/calendarPicker/util.js +0 -50
- package/src/holidayData.js +0 -127
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
function Lunar(this: any) {
|
|
2
|
+
this.isleap = false;
|
|
3
|
+
this.lunarDay = 0;
|
|
4
|
+
this.lunarMonth = 0;
|
|
5
|
+
this.lunarYear = 0;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function Solar(this: any) {
|
|
9
|
+
this.solarDay = 0;
|
|
10
|
+
this.solarMonth = 0;
|
|
11
|
+
this.solarYear = 0;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function LunarSolarConverter(this: any) {
|
|
15
|
+
this.lunar_month_days = [
|
|
16
|
+
1887, 0x1694, 0x16aa, 0x4ad5, 0xab6, 0xc4b7, 0x4ae, 0xa56, 0xb52a, 0x1d2a,
|
|
17
|
+
0xd54, 0x75aa, 0x156a, 0x1096d, 0x95c, 0x14ae, 0xaa4d, 0x1a4c, 0x1b2a,
|
|
18
|
+
0x8d55, 0xad4, 0x135a, 0x495d, 0x95c, 0xd49b, 0x149a, 0x1a4a, 0xbaa5,
|
|
19
|
+
0x16a8, 0x1ad4, 0x52da, 0x12b6, 0xe937, 0x92e, 0x1496, 0xb64b, 0xd4a, 0xda8,
|
|
20
|
+
0x95b5, 0x56c, 0x12ae, 0x492f, 0x92e, 0xcc96, 0x1a94, 0x1d4a, 0xada9, 0xb5a,
|
|
21
|
+
0x56c, 0x726e, 0x125c, 0xf92d, 0x192a, 0x1a94, 0xdb4a, 0x16aa, 0xad4,
|
|
22
|
+
0x955b, 0x4ba, 0x125a, 0x592b, 0x152a, 0xf695, 0xd94, 0x16aa, 0xaab5, 0x9b4,
|
|
23
|
+
0x14b6, 0x6a57, 0xa56, 0x1152a, 0x1d2a, 0xd54, 0xd5aa, 0x156a, 0x96c,
|
|
24
|
+
0x94ae, 0x14ae, 0xa4c, 0x7d26, 0x1b2a, 0xeb55, 0xad4, 0x12da, 0xa95d, 0x95a,
|
|
25
|
+
0x149a, 0x9a4d, 0x1a4a, 0x11aa5, 0x16a8, 0x16d4, 0xd2da, 0x12b6, 0x936,
|
|
26
|
+
0x9497, 0x1496, 0x1564b, 0xd4a, 0xda8, 0xd5b4, 0x156c, 0x12ae, 0xa92f,
|
|
27
|
+
0x92e, 0xc96, 0x6d4a, 0x1d4a, 0x10d65, 0xb58, 0x156c, 0xb26d, 0x125c,
|
|
28
|
+
0x192c, 0x9a95, 0x1a94, 0x1b4a, 0x4b55, 0xad4, 0xf55b, 0x4ba, 0x125a,
|
|
29
|
+
0xb92b, 0x152a, 0x1694, 0x96aa, 0x15aa, 0x12ab5, 0x974, 0x14b6, 0xca57,
|
|
30
|
+
0xa56, 0x1526, 0x8e95, 0xd54, 0x15aa, 0x49b5, 0x96c, 0xd4ae, 0x149c, 0x1a4c,
|
|
31
|
+
0xbd26, 0x1aa6, 0xb54, 0x6d6a, 0x12da, 0x1695d, 0x95a, 0x149a, 0xda4b,
|
|
32
|
+
0x1a4a, 0x1aa4, 0xbb54, 0x16b4, 0xada, 0x495b, 0x936, 0xf497, 0x1496,
|
|
33
|
+
0x154a, 0xb6a5, 0xda4, 0x15b4, 0x6ab6, 0x126e, 0x1092f, 0x92e, 0xc96,
|
|
34
|
+
0xcd4a, 0x1d4a, 0xd64, 0x956c, 0x155c, 0x125c, 0x792e, 0x192c, 0xfa95,
|
|
35
|
+
0x1a94, 0x1b4a, 0xab55, 0xad4, 0x14da, 0x8a5d, 0xa5a, 0x1152b, 0x152a,
|
|
36
|
+
0x1694, 0xd6aa, 0x15aa, 0xab4, 0x94ba, 0x14b6, 0xa56, 0x7527, 0xd26, 0xee53,
|
|
37
|
+
0xd54, 0x15aa, 0xa9b5, 0x96c, 0x14ae, 0x8a4e, 0x1a4c, 0x11d26, 0x1aa4,
|
|
38
|
+
0x1b54, 0xcd6a, 0xada, 0x95c, 0x949d, 0x149a, 0x1a2a, 0x5b25, 0x1aa4,
|
|
39
|
+
0xfb52, 0x16b4, 0xaba, 0xa95b, 0x936, 0x1496, 0x9a4b, 0x154a, 0x136a5,
|
|
40
|
+
0xda4, 0x15ac,
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
this.solar_1_1 = [
|
|
44
|
+
1887, 0xec04c, 0xec23f, 0xec435, 0xec649, 0xec83e, 0xeca51, 0xecc46,
|
|
45
|
+
0xece3a, 0xed04d, 0xed242, 0xed436, 0xed64a, 0xed83f, 0xeda53, 0xedc48,
|
|
46
|
+
0xede3d, 0xee050, 0xee244, 0xee439, 0xee64d, 0xee842, 0xeea36, 0xeec4a,
|
|
47
|
+
0xeee3e, 0xef052, 0xef246, 0xef43a, 0xef64e, 0xef843, 0xefa37, 0xefc4b,
|
|
48
|
+
0xefe41, 0xf0054, 0xf0248, 0xf043c, 0xf0650, 0xf0845, 0xf0a38, 0xf0c4d,
|
|
49
|
+
0xf0e42, 0xf1037, 0xf124a, 0xf143e, 0xf1651, 0xf1846, 0xf1a3a, 0xf1c4e,
|
|
50
|
+
0xf1e44, 0xf2038, 0xf224b, 0xf243f, 0xf2653, 0xf2848, 0xf2a3b, 0xf2c4f,
|
|
51
|
+
0xf2e45, 0xf3039, 0xf324d, 0xf3442, 0xf3636, 0xf384a, 0xf3a3d, 0xf3c51,
|
|
52
|
+
0xf3e46, 0xf403b, 0xf424e, 0xf4443, 0xf4638, 0xf484c, 0xf4a3f, 0xf4c52,
|
|
53
|
+
0xf4e48, 0xf503c, 0xf524f, 0xf5445, 0xf5639, 0xf584d, 0xf5a42, 0xf5c35,
|
|
54
|
+
0xf5e49, 0xf603e, 0xf6251, 0xf6446, 0xf663b, 0xf684f, 0xf6a43, 0xf6c37,
|
|
55
|
+
0xf6e4b, 0xf703f, 0xf7252, 0xf7447, 0xf763c, 0xf7850, 0xf7a45, 0xf7c39,
|
|
56
|
+
0xf7e4d, 0xf8042, 0xf8254, 0xf8449, 0xf863d, 0xf8851, 0xf8a46, 0xf8c3b,
|
|
57
|
+
0xf8e4f, 0xf9044, 0xf9237, 0xf944a, 0xf963f, 0xf9853, 0xf9a47, 0xf9c3c,
|
|
58
|
+
0xf9e50, 0xfa045, 0xfa238, 0xfa44c, 0xfa641, 0xfa836, 0xfaa49, 0xfac3d,
|
|
59
|
+
0xfae52, 0xfb047, 0xfb23a, 0xfb44e, 0xfb643, 0xfb837, 0xfba4a, 0xfbc3f,
|
|
60
|
+
0xfbe53, 0xfc048, 0xfc23c, 0xfc450, 0xfc645, 0xfc839, 0xfca4c, 0xfcc41,
|
|
61
|
+
0xfce36, 0xfd04a, 0xfd23d, 0xfd451, 0xfd646, 0xfd83a, 0xfda4d, 0xfdc43,
|
|
62
|
+
0xfde37, 0xfe04b, 0xfe23f, 0xfe453, 0xfe648, 0xfe83c, 0xfea4f, 0xfec44,
|
|
63
|
+
0xfee38, 0xff04c, 0xff241, 0xff436, 0xff64a, 0xff83e, 0xffa51, 0xffc46,
|
|
64
|
+
0xffe3a, 0x10004e, 0x100242, 0x100437, 0x10064b, 0x100841, 0x100a53,
|
|
65
|
+
0x100c48, 0x100e3c, 0x10104f, 0x101244, 0x101438, 0x10164c, 0x101842,
|
|
66
|
+
0x101a35, 0x101c49, 0x101e3d, 0x102051, 0x102245, 0x10243a, 0x10264e,
|
|
67
|
+
0x102843, 0x102a37, 0x102c4b, 0x102e3f, 0x103053, 0x103247, 0x10343b,
|
|
68
|
+
0x10364f, 0x103845, 0x103a38, 0x103c4c, 0x103e42, 0x104036, 0x104249,
|
|
69
|
+
0x10443d, 0x104651, 0x104846, 0x104a3a, 0x104c4e, 0x104e43, 0x105038,
|
|
70
|
+
0x10524a, 0x10543e, 0x105652, 0x105847, 0x105a3b, 0x105c4f, 0x105e45,
|
|
71
|
+
0x106039, 0x10624c, 0x106441, 0x106635, 0x106849, 0x106a3d, 0x106c51,
|
|
72
|
+
0x106e47, 0x10703c, 0x10724f, 0x107444, 0x107638, 0x10784c, 0x107a3f,
|
|
73
|
+
0x107c53, 0x107e48,
|
|
74
|
+
];
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* @return {number}
|
|
78
|
+
*/
|
|
79
|
+
this.GetBitInt = function (data: number, length: number, shift: number) {
|
|
80
|
+
return (data & (((1 << length) - 1) << shift)) >> shift;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
// WARNING: Dates before Oct. 1582 are inaccurate
|
|
84
|
+
/**
|
|
85
|
+
* @return {number}
|
|
86
|
+
*/
|
|
87
|
+
this.SolarToInt = function (y: number, m: number, d: number) {
|
|
88
|
+
m = (m + 9) % 12;
|
|
89
|
+
y = parseInt(String(y)) - parseInt(String(m / 10));
|
|
90
|
+
return (
|
|
91
|
+
365 * y +
|
|
92
|
+
parseInt(String(y / 4)) -
|
|
93
|
+
parseInt(String(y / 100)) +
|
|
94
|
+
parseInt(String(y / 400)) +
|
|
95
|
+
parseInt(String((m * 306 + 5) / 10)) +
|
|
96
|
+
(d - 1)
|
|
97
|
+
);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
this.SolarFromInt = function (g: number) {
|
|
101
|
+
let y = parseInt(String((10000 * g + 14780) / 3652425));
|
|
102
|
+
let ddd =
|
|
103
|
+
g -
|
|
104
|
+
(365 * y +
|
|
105
|
+
parseInt(String(y / 4)) -
|
|
106
|
+
parseInt(String(y / 100)) +
|
|
107
|
+
parseInt(String(y / 400)));
|
|
108
|
+
if (ddd < 0) {
|
|
109
|
+
y--;
|
|
110
|
+
ddd =
|
|
111
|
+
g -
|
|
112
|
+
(365 * y +
|
|
113
|
+
parseInt(String(y / 4)) -
|
|
114
|
+
parseInt(String(y / 100)) +
|
|
115
|
+
parseInt(String(y / 400)));
|
|
116
|
+
}
|
|
117
|
+
const mi = parseInt(String((100 * ddd + 52) / 3060));
|
|
118
|
+
const mm = ((mi + 2) % 12) + 1;
|
|
119
|
+
y += parseInt(String((mi + 2) / 12));
|
|
120
|
+
const dd = ddd - parseInt(String((mi * 306 + 5) / 10)) + 1;
|
|
121
|
+
// @ts-ignore
|
|
122
|
+
const solar = new Solar();
|
|
123
|
+
solar.solarYear = parseInt(String(y));
|
|
124
|
+
solar.solarMonth = parseInt(String(mm));
|
|
125
|
+
solar.solarDay = parseInt(String(dd));
|
|
126
|
+
return solar;
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
this.LunarToSolar = function (lunar: {
|
|
130
|
+
lunarYear: number;
|
|
131
|
+
isleap: any;
|
|
132
|
+
lunarMonth: number;
|
|
133
|
+
lunarDay: number;
|
|
134
|
+
}) {
|
|
135
|
+
const days =
|
|
136
|
+
this.lunar_month_days[lunar.lunarYear - this.lunar_month_days[0]];
|
|
137
|
+
const leap = this.GetBitInt(days, 4, 13);
|
|
138
|
+
let offset = 0;
|
|
139
|
+
let loopend = leap;
|
|
140
|
+
if (!lunar.isleap) {
|
|
141
|
+
if (lunar.lunarMonth <= leap || leap === 0) {
|
|
142
|
+
loopend = lunar.lunarMonth - 1;
|
|
143
|
+
} else {
|
|
144
|
+
loopend = lunar.lunarMonth;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
for (let i = 0; i < loopend; i++) {
|
|
148
|
+
offset += this.GetBitInt(days, 1, 12 - i) === 1 ? 30 : 29;
|
|
149
|
+
}
|
|
150
|
+
offset += lunar.lunarDay;
|
|
151
|
+
|
|
152
|
+
const solar11 = this.solar_1_1[lunar.lunarYear - this.solar_1_1[0]];
|
|
153
|
+
|
|
154
|
+
const y = this.GetBitInt(solar11, 12, 9);
|
|
155
|
+
const m = this.GetBitInt(solar11, 4, 5);
|
|
156
|
+
const d = this.GetBitInt(solar11, 5, 0);
|
|
157
|
+
|
|
158
|
+
return this.SolarFromInt(this.SolarToInt(y, m, d) + offset - 1);
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
this.SolarToLunar = function (solar: {
|
|
162
|
+
solarYear: number;
|
|
163
|
+
solarMonth: number;
|
|
164
|
+
solarDay: number;
|
|
165
|
+
}) {
|
|
166
|
+
// @ts-ignore
|
|
167
|
+
const lunar = new Lunar();
|
|
168
|
+
let index = solar.solarYear - this.solar_1_1[0];
|
|
169
|
+
const data =
|
|
170
|
+
(solar.solarYear << 9) | (solar.solarMonth << 5) | solar.solarDay;
|
|
171
|
+
if (this.solar_1_1[index] > data) {
|
|
172
|
+
index--;
|
|
173
|
+
}
|
|
174
|
+
const solar11 = this.solar_1_1[index];
|
|
175
|
+
const y = this.GetBitInt(solar11, 12, 9);
|
|
176
|
+
const m = this.GetBitInt(solar11, 4, 5);
|
|
177
|
+
const d = this.GetBitInt(solar11, 5, 0);
|
|
178
|
+
let offset =
|
|
179
|
+
this.SolarToInt(solar.solarYear, solar.solarMonth, solar.solarDay) -
|
|
180
|
+
this.SolarToInt(y, m, d);
|
|
181
|
+
|
|
182
|
+
const days = this.lunar_month_days[index];
|
|
183
|
+
const leap = this.GetBitInt(days, 4, 13);
|
|
184
|
+
|
|
185
|
+
const lunarY = index + this.solar_1_1[0];
|
|
186
|
+
let lunarM = 1;
|
|
187
|
+
offset += 1;
|
|
188
|
+
|
|
189
|
+
for (let i = 0; i < 13; i++) {
|
|
190
|
+
const dm = this.GetBitInt(days, 1, 12 - i) === 1 ? 30 : 29;
|
|
191
|
+
if (offset > dm) {
|
|
192
|
+
lunarM++;
|
|
193
|
+
offset -= dm;
|
|
194
|
+
} else {
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
const lunarD = parseInt(String(offset));
|
|
199
|
+
lunar.lunarYear = lunarY;
|
|
200
|
+
lunar.lunarMonth = lunarM;
|
|
201
|
+
lunar.isleap = false;
|
|
202
|
+
if (leap !== 0 && lunarM > leap) {
|
|
203
|
+
lunar.lunarMonth = lunarM - 1;
|
|
204
|
+
if (lunarM === leap + 1) {
|
|
205
|
+
lunar.isleap = true;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
lunar.lunarDay = lunarD;
|
|
210
|
+
return lunar;
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export default LunarSolarConverter;
|
|
@@ -1,100 +1,102 @@
|
|
|
1
|
-
const removeFractionalPart = number
|
|
1
|
+
const removeFractionalPart = (number: string | number) =>
|
|
2
|
+
parseInt(String(number));
|
|
2
3
|
|
|
3
4
|
/* Compute the (integral) Julian day number of day dd/mm/yyyy, i.e., the number
|
|
4
5
|
* of days between 1/1/4713 BC (Julian calendar) and dd/mm/yyyy.
|
|
5
6
|
* Formula from http://www.tondering.dk/claus/calendar.html
|
|
6
7
|
*/
|
|
7
|
-
const jdFromDate = (dd, mm, yy) => {
|
|
8
|
+
const jdFromDate = (dd: number, mm: number, yy: number) => {
|
|
8
9
|
let a, y, m, jd;
|
|
9
10
|
a = removeFractionalPart((14 - mm) / 12);
|
|
10
11
|
y = yy + 4800 - a;
|
|
11
12
|
m = mm + 12 * a - 3;
|
|
12
|
-
jd =
|
|
13
|
-
|
|
13
|
+
jd =
|
|
14
|
+
dd +
|
|
15
|
+
removeFractionalPart((153 * m + 2) / 5) +
|
|
16
|
+
365 * y +
|
|
17
|
+
removeFractionalPart(y / 4) -
|
|
18
|
+
removeFractionalPart(y / 100) +
|
|
19
|
+
removeFractionalPart(y / 400) -
|
|
20
|
+
32045;
|
|
14
21
|
if (jd < 2299161) {
|
|
15
|
-
jd =
|
|
22
|
+
jd =
|
|
23
|
+
dd +
|
|
24
|
+
removeFractionalPart((153 * m + 2) / 5) +
|
|
25
|
+
365 * y +
|
|
26
|
+
removeFractionalPart(y / 4) -
|
|
27
|
+
32083;
|
|
16
28
|
}
|
|
17
29
|
return jd;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/* Convert a Julian day number to day/month/year. Parameter jd is an integer */
|
|
21
|
-
const jdToDate = (jd) => {
|
|
22
|
-
let a, b, c, d, e, m, day, month, year;
|
|
23
|
-
if (jd > 2299160) { // After 5/10/1582, Gregorian calendar
|
|
24
|
-
a = jd + 32044;
|
|
25
|
-
b = removeFractionalPart((4 * a + 3) / 146097);
|
|
26
|
-
c = a - removeFractionalPart((b * 146097) / 4);
|
|
27
|
-
} else {
|
|
28
|
-
b = 0;
|
|
29
|
-
c = jd + 32082;
|
|
30
|
-
}
|
|
31
|
-
d = removeFractionalPart((4 * c + 3) / 1461);
|
|
32
|
-
e = c - removeFractionalPart((1461 * d) / 4);
|
|
33
|
-
m = removeFractionalPart((5 * e + 2) / 153);
|
|
34
|
-
day = e - removeFractionalPart((153 * m + 2) / 5) + 1;
|
|
35
|
-
month = m + 3 - 12 * removeFractionalPart(m / 10);
|
|
36
|
-
year = b * 100 + d - 4800 + removeFractionalPart(m / 10);
|
|
37
|
-
return [day, month, year];
|
|
38
|
-
}
|
|
30
|
+
};
|
|
39
31
|
|
|
40
32
|
/* Compute the time of the k-th new moon after the new moon of 1/1/1900 13:52 UCT
|
|
41
33
|
* (measured as the number of days since 1/1/4713 BC noon UCT, e.g., 2451545.125 is 1/1/2000 15:00 UTC).
|
|
42
34
|
* Returns a floating number, e.g., 2415079.9758617813 for k=2 or 2414961.935157746 for k=-2
|
|
43
35
|
* Algorithm from: "Astronomical Algorithms" by Jean Meeus, 1998
|
|
44
36
|
*/
|
|
45
|
-
const NewMoon = (k) => {
|
|
37
|
+
const NewMoon = (k: number) => {
|
|
46
38
|
let T, T2, T3, dr, Jd1, M, Mpr, F, C1, deltat, JdNew;
|
|
47
39
|
T = k / 1236.85; // Time in Julian centuries from 1900 January 0.5
|
|
48
40
|
T2 = T * T;
|
|
49
41
|
T3 = T2 * T;
|
|
50
42
|
dr = Math.PI / 180;
|
|
51
43
|
Jd1 = 2415020.75933 + 29.53058868 * k + 0.0001178 * T2 - 0.000000155 * T3;
|
|
52
|
-
Jd1 = Jd1 + 0.00033 *
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
0.
|
|
58
|
-
F = 21.2964 + 390.67050646 * k - 0.0016528 * T2 -
|
|
59
|
-
0.00000239 * T3; // Moon's argument of latitude
|
|
60
|
-
C1 = (0.1734 - 0.000393 * T) * Math.sin(M * dr) + 0.0021 * Math.sin(2 * dr * M);
|
|
44
|
+
Jd1 = Jd1 + 0.00033 * Math.sin((166.56 + 132.87 * T - 0.009173 * T2) * dr); // Mean new moon
|
|
45
|
+
M = 359.2242 + 29.10535608 * k - 0.0000333 * T2 - 0.00000347 * T3; // Sun's mean anomaly
|
|
46
|
+
Mpr = 306.0253 + 385.81691806 * k + 0.0107306 * T2 + 0.00001236 * T3; // Moon's mean anomaly
|
|
47
|
+
F = 21.2964 + 390.67050646 * k - 0.0016528 * T2 - 0.00000239 * T3; // Moon's argument of latitude
|
|
48
|
+
C1 =
|
|
49
|
+
(0.1734 - 0.000393 * T) * Math.sin(M * dr) + 0.0021 * Math.sin(2 * dr * M);
|
|
61
50
|
C1 = C1 - 0.4068 * Math.sin(Mpr * dr) + 0.0161 * Math.sin(dr * 2 * Mpr);
|
|
62
51
|
C1 = C1 - 0.0004 * Math.sin(dr * 3 * Mpr);
|
|
63
52
|
C1 = C1 + 0.0104 * Math.sin(dr * 2 * F) - 0.0051 * Math.sin(dr * (M + Mpr));
|
|
64
|
-
C1 =
|
|
65
|
-
|
|
66
|
-
|
|
53
|
+
C1 =
|
|
54
|
+
C1 -
|
|
55
|
+
0.0074 * Math.sin(dr * (M - Mpr)) +
|
|
56
|
+
0.0004 * Math.sin(dr * (2 * F + M));
|
|
57
|
+
C1 =
|
|
58
|
+
C1 -
|
|
59
|
+
0.0004 * Math.sin(dr * (2 * F - M)) -
|
|
60
|
+
0.0006 * Math.sin(dr * (2 * F + Mpr));
|
|
61
|
+
C1 =
|
|
62
|
+
C1 +
|
|
63
|
+
0.001 * Math.sin(dr * (2 * F - Mpr)) +
|
|
64
|
+
0.0005 * Math.sin(dr * (2 * Mpr + M));
|
|
67
65
|
if (T < -11) {
|
|
68
|
-
deltat =
|
|
66
|
+
deltat =
|
|
67
|
+
0.001 +
|
|
68
|
+
0.000839 * T +
|
|
69
|
+
0.0002261 * T2 -
|
|
70
|
+
0.00000845 * T3 -
|
|
69
71
|
0.000000081 * T * T3;
|
|
70
72
|
} else {
|
|
71
73
|
deltat = -0.000278 + 0.000265 * T + 0.000262 * T2;
|
|
72
74
|
}
|
|
73
75
|
JdNew = Jd1 + C1 - deltat;
|
|
74
76
|
return JdNew;
|
|
75
|
-
}
|
|
77
|
+
};
|
|
76
78
|
|
|
77
79
|
/* Compute the longitude of the sun at any time.
|
|
78
80
|
* Parameter: floating number jdn, the number of days since 1/1/4713 BC noon
|
|
79
81
|
* Algorithm from: "Astronomical Algorithms" by Jean Meeus, 1998
|
|
80
82
|
*/
|
|
81
|
-
const SunLongitude = (jdn) =>
|
|
83
|
+
const SunLongitude = (jdn: number) => {
|
|
82
84
|
let T, T2, dr, M, L0, DL, L;
|
|
83
|
-
T = (jdn - 2451545.0) /
|
|
84
|
-
36525; // Time in Julian centuries from 2000-01-01 12:00:00 GMT
|
|
85
|
+
T = (jdn - 2451545.0) / 36525; // Time in Julian centuries from 2000-01-01 12:00:00 GMT
|
|
85
86
|
T2 = T * T;
|
|
86
87
|
dr = Math.PI / 180; // degree to radian
|
|
87
|
-
M = 357.
|
|
88
|
-
0.00000048 * T * T2; // mean anomaly, degree
|
|
88
|
+
M = 357.5291 + 35999.0503 * T - 0.0001559 * T2 - 0.00000048 * T * T2; // mean anomaly, degree
|
|
89
89
|
L0 = 280.46645 + 36000.76983 * T + 0.0003032 * T2; // mean longitude, degree
|
|
90
|
-
DL = (1.
|
|
91
|
-
DL =
|
|
92
|
-
|
|
90
|
+
DL = (1.9146 - 0.004817 * T - 0.000014 * T2) * Math.sin(dr * M);
|
|
91
|
+
DL =
|
|
92
|
+
DL +
|
|
93
|
+
(0.019993 - 0.000101 * T) * Math.sin(dr * 2 * M) +
|
|
94
|
+
0.00029 * Math.sin(dr * 3 * M);
|
|
93
95
|
L = L0 + DL; // true longitude, degree
|
|
94
96
|
L = L * dr;
|
|
95
|
-
L = L - Math.PI * 2 *
|
|
97
|
+
L = L - Math.PI * 2 * Math.sin(L / (Math.PI * 2)); // Normalize to (0, 2*PI)
|
|
96
98
|
return L;
|
|
97
|
-
}
|
|
99
|
+
};
|
|
98
100
|
|
|
99
101
|
/* Compute sun position at midnight of the day with the given Julian day number.
|
|
100
102
|
* The time zone if the time difference between local time and UTC: 7.0 for UTC+7:00.
|
|
@@ -102,19 +104,21 @@ const SunLongitude = (jdn) => {
|
|
|
102
104
|
* From the day after March equinox and the 1st major term after March equinox, 0 is returned.
|
|
103
105
|
* After that, return 1, 2, 3 ...
|
|
104
106
|
*/
|
|
105
|
-
const getSunLongitude = (dayNumber, timeZone) => {
|
|
106
|
-
return removeFractionalPart(
|
|
107
|
-
|
|
107
|
+
const getSunLongitude = (dayNumber: number, timeZone: number) => {
|
|
108
|
+
return removeFractionalPart(
|
|
109
|
+
(SunLongitude(dayNumber - 0.5 - timeZone / 24) / Math.PI) * 6
|
|
110
|
+
);
|
|
111
|
+
};
|
|
108
112
|
|
|
109
113
|
/* Compute the day of the k-th new moon in the given time zone.
|
|
110
114
|
* The time zone if the time difference between local time and UTC: 7.0 for UTC+7:00
|
|
111
115
|
*/
|
|
112
|
-
const getNewMoonDay = (k, timeZone) => {
|
|
116
|
+
const getNewMoonDay = (k: number, timeZone: number) => {
|
|
113
117
|
return removeFractionalPart(NewMoon(k) + 0.5 + timeZone / 24);
|
|
114
|
-
}
|
|
118
|
+
};
|
|
115
119
|
|
|
116
120
|
/* Find the day that starts the luner month 11 of the given year for the given time zone */
|
|
117
|
-
const getLunarMonth11 = (yy, timeZone) => {
|
|
121
|
+
const getLunarMonth11 = (yy: number, timeZone: number) => {
|
|
118
122
|
let k, off, nm, sunLong;
|
|
119
123
|
//off = jdFromDate(31, 12, yy) - 2415021.076998695;
|
|
120
124
|
off = jdFromDate(31, 12, yy) - 2415021;
|
|
@@ -125,10 +129,10 @@ const getLunarMonth11 = (yy, timeZone) => {
|
|
|
125
129
|
nm = getNewMoonDay(k - 1, timeZone);
|
|
126
130
|
}
|
|
127
131
|
return nm;
|
|
128
|
-
}
|
|
132
|
+
};
|
|
129
133
|
|
|
130
134
|
/* Find the index of the leap month after the month starting on the day a11. */
|
|
131
|
-
const getLeapMonthOffset = (a11, timeZone) => {
|
|
135
|
+
const getLeapMonthOffset = (a11: number, timeZone: number) => {
|
|
132
136
|
let k, last, arc, i;
|
|
133
137
|
k = removeFractionalPart((a11 - 2415021.076998695) / 29.530588853 + 0.5);
|
|
134
138
|
last = 0;
|
|
@@ -140,11 +144,23 @@ const getLeapMonthOffset = (a11, timeZone) => {
|
|
|
140
144
|
arc = getSunLongitude(getNewMoonDay(k + i, timeZone), timeZone);
|
|
141
145
|
} while (arc !== last && i < 14);
|
|
142
146
|
return i - 1;
|
|
143
|
-
}
|
|
147
|
+
};
|
|
144
148
|
|
|
145
149
|
/* Comvert solar date dd/mm/yyyy to the corresponding lunar date */
|
|
146
|
-
export const convertSolar2Lunar = (
|
|
147
|
-
|
|
150
|
+
export const convertSolar2Lunar = (
|
|
151
|
+
dd: number,
|
|
152
|
+
mm: number,
|
|
153
|
+
yy: number,
|
|
154
|
+
timeZone: number
|
|
155
|
+
) => {
|
|
156
|
+
let k,
|
|
157
|
+
dayNumber,
|
|
158
|
+
monthStart,
|
|
159
|
+
a11,
|
|
160
|
+
b11,
|
|
161
|
+
lunarDay,
|
|
162
|
+
lunarMonth,
|
|
163
|
+
lunarYear,
|
|
148
164
|
lunarLeap;
|
|
149
165
|
dayNumber = jdFromDate(dd, mm, yy);
|
|
150
166
|
k = removeFractionalPart((dayNumber - 2415021.076998695) / 29.530588853);
|
|
@@ -181,5 +197,10 @@ export const convertSolar2Lunar = (dd, mm, yy, timeZone) => {
|
|
|
181
197
|
if (lunarMonth >= 11 && diff < 4) {
|
|
182
198
|
lunarYear -= 1;
|
|
183
199
|
}
|
|
184
|
-
return {
|
|
185
|
-
|
|
200
|
+
return {
|
|
201
|
+
lunarDay,
|
|
202
|
+
lunarMonth: lunarMonth,
|
|
203
|
+
lunarYear,
|
|
204
|
+
isleap: lunarLeap,
|
|
205
|
+
};
|
|
206
|
+
};
|
package/Month.tsx
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import React, {PureComponent} from 'react';
|
|
2
|
+
|
|
3
|
+
import {View} from 'react-native';
|
|
4
|
+
import moment from 'moment';
|
|
5
|
+
import Moment from 'moment';
|
|
6
|
+
import Day from './Day';
|
|
7
|
+
import {scaleSize, Spacing} from '@momo-kits/foundation';
|
|
8
|
+
import {MonthProps} from './types';
|
|
9
|
+
import {ContainerContext} from './index';
|
|
10
|
+
|
|
11
|
+
export default class Month extends PureComponent<MonthProps> {
|
|
12
|
+
rowArray;
|
|
13
|
+
temp;
|
|
14
|
+
constructor(props: MonthProps) {
|
|
15
|
+
super(props);
|
|
16
|
+
const {dateList} = props;
|
|
17
|
+
this.rowArray = new Array(dateList.length / 7).fill('');
|
|
18
|
+
this.temp = this.rowArray.map((item, i) =>
|
|
19
|
+
dateList.slice(i * 7, i * 7 + 7),
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
findHoliday = (date: Moment.Moment) => {
|
|
24
|
+
const {holidays} = this.props;
|
|
25
|
+
if (date && holidays && holidays.length > 0) {
|
|
26
|
+
const day = date.date();
|
|
27
|
+
const month = date.month() + 1;
|
|
28
|
+
return holidays.find(item => item.day === day && item.month === month);
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
checkHoliday = (date: moment.Moment) => {
|
|
34
|
+
const holiday = this.findHoliday(date);
|
|
35
|
+
return {
|
|
36
|
+
isSolarHoliday: !!(holiday && !holiday.lunar),
|
|
37
|
+
isLunarHoliday: !!(holiday && holiday.lunar),
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
renderDayRow = (dayList: any[], index: number) => (
|
|
42
|
+
<View
|
|
43
|
+
style={{
|
|
44
|
+
flexDirection: 'row',
|
|
45
|
+
alignItems: 'center',
|
|
46
|
+
marginBottom: Spacing.XS,
|
|
47
|
+
height: scaleSize(48),
|
|
48
|
+
}}
|
|
49
|
+
key={`row${index}`}>
|
|
50
|
+
{dayList.map((item, i) => {
|
|
51
|
+
const keyDay = moment(item.date).format('YYYY-MM-DD');
|
|
52
|
+
const priceInfo = this.props?.priceListDate?.[keyDay];
|
|
53
|
+
const {
|
|
54
|
+
minDate,
|
|
55
|
+
maxDate,
|
|
56
|
+
startDate,
|
|
57
|
+
endDate,
|
|
58
|
+
isShowLunar,
|
|
59
|
+
isDoubleDateMode,
|
|
60
|
+
disabledDays,
|
|
61
|
+
} = this.props;
|
|
62
|
+
|
|
63
|
+
const dateItem = new Date(item.date);
|
|
64
|
+
const mappedDisabledArray = disabledDays?.map(item => String(item));
|
|
65
|
+
const isDisabled = mappedDisabledArray?.includes(String(dateItem));
|
|
66
|
+
|
|
67
|
+
return (
|
|
68
|
+
<Day
|
|
69
|
+
{...this.props}
|
|
70
|
+
minDate={minDate}
|
|
71
|
+
maxDate={maxDate}
|
|
72
|
+
isShowLunar={isShowLunar}
|
|
73
|
+
isDoubleDateMode={isDoubleDateMode}
|
|
74
|
+
startDate={startDate}
|
|
75
|
+
endDate={endDate}
|
|
76
|
+
{...this.checkHoliday(item.date)}
|
|
77
|
+
date={item.date}
|
|
78
|
+
havePriceList={!!this.props.priceListDate}
|
|
79
|
+
lunarDate={item.lunarDate}
|
|
80
|
+
empty={item.empty}
|
|
81
|
+
key={`day${i.toString()}`}
|
|
82
|
+
index={i}
|
|
83
|
+
price={priceInfo?.priceAsString}
|
|
84
|
+
isBestPrice={priceInfo?.isBestPrice}
|
|
85
|
+
isDisabled={isDisabled}
|
|
86
|
+
/>
|
|
87
|
+
);
|
|
88
|
+
})}
|
|
89
|
+
</View>
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
render() {
|
|
93
|
+
const {month} = this.props;
|
|
94
|
+
if (month) {
|
|
95
|
+
return (
|
|
96
|
+
<ContainerContext.Consumer>
|
|
97
|
+
{size => (
|
|
98
|
+
<View style={{width: size.width}}>
|
|
99
|
+
<View
|
|
100
|
+
style={{
|
|
101
|
+
paddingHorizontal: Spacing.S,
|
|
102
|
+
width: '100%',
|
|
103
|
+
alignItems: 'center',
|
|
104
|
+
}}>
|
|
105
|
+
{this.temp.map((item, i) => this.renderDayRow(item, i))}
|
|
106
|
+
</View>
|
|
107
|
+
</View>
|
|
108
|
+
)}
|
|
109
|
+
</ContainerContext.Consumer>
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
return <View />;
|
|
113
|
+
}
|
|
114
|
+
}
|