@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.
@@ -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 => parseInt(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 = dd + removeFractionalPart((153 * m + 2) / 5) + 365 * y + removeFractionalPart(y / 4) - removeFractionalPart(y / 100) +
13
- removeFractionalPart(y / 400) - 32045;
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 = dd + removeFractionalPart((153 * m + 2) / 5) + 365 * y + removeFractionalPart(y / 4) - 32083;
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
- Math.sin((166.56 + 132.87 * T - 0.009173 * T2) * dr); // Mean new moon
54
- M = 359.2242 + 29.10535608 * k - 0.0000333 * T2 -
55
- 0.00000347 * T3; // Sun's mean anomaly
56
- Mpr = 306.0253 + 385.81691806 * k + 0.0107306 * T2 +
57
- 0.00001236 * T3; // Moon's mean anomaly
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 = C1 - 0.0074 * Math.sin(dr * (M - Mpr)) + 0.0004 * Math.sin(dr * (2 * F + M));
65
- C1 = C1 - 0.0004 * Math.sin(dr * (2 * F - M)) - 0.0006 * Math.sin(dr * (2 * F + Mpr));
66
- C1 = C1 + 0.0010 * Math.sin(dr * (2 * F - Mpr)) + 0.0005 * Math.sin(dr * (2 * Mpr + M));
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 = 0.001 + 0.000839 * T + 0.0002261 * T2 - 0.00000845 * T3 -
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.52910 + 35999.05030 * T - 0.0001559 * T2 -
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.914600 - 0.004817 * T - 0.000014 * T2) * Math.sin(dr * M);
91
- DL = DL + (0.019993 - 0.000101 * T) * Math.sin(dr * 2 * M) +
92
- 0.000290 * Math.sin(dr * 3 * M);
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 * (Math.sin(L / (Math.PI * 2))); // Normalize to (0, 2*PI)
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(SunLongitude(dayNumber - 0.5 - timeZone / 24) / Math.PI * 6);
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 = (dd, mm, yy, timeZone) => {
147
- let k, dayNumber, monthStart, a11, b11, lunarDay, lunarMonth, lunarYear,
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 { lunarDay, lunarMonth: lunarMonth, lunarYear, isleap: lunarLeap};
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
+ }