kor-lunar 1.3.3 → 1.5.0

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/README.md CHANGED
@@ -1,23 +1,28 @@
1
1
  # kor-lunar
2
2
 
3
- 이 라이브러리는 학습용으로 제작되었으며, 한국천문연구원(KASI)의 음력·양력 데이터를 기반으로 한 자바스크립트 라이브러리입니다. 오프라인 환경에서도 사용할 수 있도록 구현되었습니다.
3
+ 이 라이브러리는 학습용으로 제작되었으며, 한국천문연구원(KASI)의 음력·양력 변환 데이터를 기반으로 한 자바스크립트 라이브러리입니다.
4
+ 네트워크 요청 없이 **오프라인에서도 동작**하고, 별도의 외부 의존성이 없습니다.
4
5
 
5
- > **⚠️ 주의:** 데이터는 2016이후로 갱신되지 않아 최신 변경 사항이 반영되지 않을 수 있습니다. 중요한 작업에는 아래 [한국천문연구원 공식 API](#출처-및-참고-자료)를 사용하시기 바랍니다.
6
+ > **⚠️ 주의:** 데이터는 **20255월 20일 기준**으로 갱신되었습니다.
7
+ > 이후의 중요한 변경 사항이 반영되지 않을 수 있으므로,
8
+ > 중요한 작업에는 아래 [한국천문연구원 공식 API](#출처-및-참고-자료)를 사용하시기 바랍니다.
6
9
 
7
10
  ## 특징
8
11
 
9
- - **음력 ↔ 양력 변환** 지원
10
- - **윤달 처리** 가능 (`isLeapMonth` 옵션)
11
- - **음력 간지 출력**: 세차(`secha`), 월건(`wolgeon`), 일진(`iljin`) 포함
12
+ - **음력 ↔ 양력 변환** - `toLunar`, `toSolar`
13
+ - **윤달 처리** - `isLeapMonth` 옵션
14
+ - **음력 간지 출력** - 세차(`secha`), 월건(`wolgeon`), 일진(`iljin`)
12
15
  - 윤달인 경우 `wolgeon`은 빈 문자열로 반환됩니다
13
- - **오프라인** 환경에서도 사용 가능
16
+ - **TypeScript 지원** - 타입 정의 기본 제공
17
+ - **Zero Dependencies** - 외부 의존성 없음
18
+ - **CJS / ESM / UMD** — 다양한 환경에서 사용 가능
14
19
 
15
20
  - [예제 사이트](https://kahyou22.github.io/kor-lunar-js/)
16
21
 
17
22
  ## 지원 날짜 범위
18
23
 
19
- - **toLunar**: `양력 → 음력` 날짜 범위 1890년 1월 21일 ~ 2050년 1월 22
20
- - **toSolar**: `음력 → 양력` 날짜 범위 1890년 1월 1일 ~ 2049년 12월 29
24
+ - **toLunar**: `양력 → 음력` 날짜 범위 1890년 1월 21일 ~ 2050년 12월 31
25
+ - **toSolar**: `음력 → 양력` 날짜 범위 1890년 1월 1일 ~ 2050년 11월 18
21
26
 
22
27
  _범위를 벗어난 날짜가 입력될 경우 `RangeError`가 발생하며, 오류 메시지에 입력한 날짜 정보가 포함됩니다._
23
28
 
@@ -27,6 +32,14 @@ _범위를 벗어난 날짜가 입력될 경우 `RangeError`가 발생하며,
27
32
  npm install kor-lunar
28
33
  ```
29
34
 
35
+ ### 브라우저 CDN
36
+
37
+ ```html
38
+ <script src="https://cdn.jsdelivr.net/npm/kor-lunar@1.4/dist/kor-lunar.min.js"></script>
39
+ ```
40
+
41
+ CDN 사용 시 전역 변수 `korLunar`로 접근할 수 있습니다.
42
+
30
43
  ## 사용법
31
44
 
32
45
  ### 모듈 불러오기
@@ -37,10 +50,10 @@ import korLunar from "kor-lunar";
37
50
  const korLunar = require("kor-lunar");
38
51
  ```
39
52
 
40
- ### 브라우저 CDN
53
+ Named export도 지원합니다:
41
54
 
42
- ```html
43
- <script src="https://cdn.jsdelivr.net/npm/kor-lunar@1.3.3/dist/kor-lunar.min.js"></script>
55
+ ```js
56
+ import { toLunar, toSolar } from "kor-lunar";
44
57
  ```
45
58
 
46
59
  ## 예제
@@ -64,6 +77,7 @@ console.log(korLunar.toLunar(2025, 6, 25));
64
77
  // dayOfWeek: 3
65
78
  // }
66
79
 
80
+ // 양력 → 음력 (윤달)
67
81
  console.log(korLunar.toLunar(2025, 7, 25));
68
82
  // {
69
83
  // year: 2025,
@@ -85,8 +99,8 @@ console.log(korLunar.toSolar(2025, 6, 1, true));
85
99
  // { year: 2025, month: 7, day: 25 }
86
100
  ```
87
101
 
88
- > 권장되진 않지만, `korLunar.LunarData`나 `korLunar.SolarData` 같은 내부 함수에 직접 접근할 수도 있습니다.
89
- > 이를 통해 단순 음력 변환을 넘어, 더 다양한 기능을 구현할 수 있습니다.
102
+ > 권장되진 않지만, `korLunar.LunarTable`과 `korLunar.SolarTable` 같은 내부 함수에 직접 접근할 수도 있습니다.
103
+ > 이를 통해 단순 음력 변환 뿐만 아니라, 더 다양한 기능을 구현할 수 있습니다.
90
104
  > [예제 사이트: 음력 달력](https://kahyou22.github.io/kor-lunar-js/#lunarCalendar)
91
105
 
92
106
  ## 라이선스
package/dist/index.d.ts CHANGED
@@ -1,9 +1,11 @@
1
- import { toLunar, toSolar, LunarData, SolarData, LunarDate, SolarDate } from "./kor-lunar";
1
+ import { toLunar, toSolar, LunarTable, SolarTable, LunarData, SolarData, LunarDate, SolarDate } from "./kor-lunar";
2
2
  declare const korLunar: {
3
3
  toLunar: (solYear: number, solMonth: number, solDay: number) => LunarDate;
4
4
  toSolar: (lunYear: number, lunMonth: number, lunDay: number, isLeapMonth: boolean) => SolarDate;
5
- LunarData: typeof LunarData;
6
- SolarData: typeof SolarData;
5
+ LunarTable: typeof LunarTable;
6
+ SolarTable: typeof SolarTable;
7
+ LunarData: typeof LunarTable;
8
+ SolarData: typeof SolarTable;
7
9
  };
8
10
  export default korLunar;
9
- export { toLunar, toSolar, LunarData, SolarData, LunarDate, SolarDate };
11
+ export { toLunar, toSolar, LunarTable, SolarTable, LunarData, SolarData, LunarDate, SolarDate };
@@ -1,3 +1,5 @@
1
+ import * as LunarTable from "./lunar-table";
2
+ import * as SolarTable from "./solar-table";
1
3
  export interface LunarDate {
2
4
  year: number;
3
5
  month: number;
@@ -16,7 +18,7 @@ export interface SolarDate {
16
18
  }
17
19
  /**
18
20
  * 양력을 음력으로 변환합니다.
19
- * 양력 지원 날짜 범위: 1890년 1월 21일 ~ 2050년 122
21
+ * 양력 지원 날짜 범위: 1890년 1월 21일 ~ 2050년 1231
20
22
  * @param solYear 양력 연도
21
23
  * @param solMonth 양력 월
22
24
  * @param solDay 양력 일
@@ -25,7 +27,7 @@ export interface SolarDate {
25
27
  export declare const toLunar: (solYear: number, solMonth: number, solDay: number) => LunarDate;
26
28
  /**
27
29
  * 음력을 양력으로 변환합니다.
28
- * 음력 지원 날짜 범위: 1890년 1월 1일 ~ 20491229
30
+ * 음력 지원 날짜 범위: 1890년 1월 1일 ~ 20501118
29
31
  * @param lunYear 음력 연도
30
32
  * @param lunMonth 음력 월
31
33
  * @param lunDay 음력 일
@@ -33,5 +35,8 @@ export declare const toLunar: (solYear: number, solMonth: number, solDay: number
33
35
  * @returns 양력 날짜
34
36
  */
35
37
  export declare const toSolar: (lunYear: number, lunMonth: number, lunDay: number, isLeapMonth: boolean) => SolarDate;
36
- export * as LunarData from "./lunar-data";
37
- export * as SolarData from "./solar-data";
38
+ export { LunarTable, SolarTable };
39
+ /** @deprecated `LunarData`는 `LunarTable`로 이름이 변경되었습니다. */
40
+ export declare const LunarData: typeof LunarTable;
41
+ /** @deprecated `SolarData`는 `SolarTable`로 이름이 변경되었습니다. */
42
+ export declare const SolarData: typeof SolarTable;
@@ -33,6 +33,7 @@ var LUN_TABLE = [
33
33
  /*2020*/ 0x3004a9d, 0x2c40556, 0x2c60ab5, 0x3002ad6, 0x2c406d2, 0x3006765, 0x2c60ea5, 0x2c40e4a, 0x2fe5656, 0x2c60c9b,
34
34
  /*2030*/ 0x2c4055a, 0x300356d, 0x2c60b69, 0x300bf52, 0x2c40752, 0x2c40b25, 0x3016b0b, 0x2c40a4b, 0x2c404ab, 0x30052bb,
35
35
  /*2040*/ 0x2c6056d, 0x2c60b69, 0x3002daa, 0x2c40d92, 0x3007ea5, 0x2c40d25, 0x2c40a4d, 0x3015a4d, 0x2c402b6, 0x2c605b5,
36
+ /*2050*/ 0x00136d1 /* 11월 18일 까지라 데이터 부족 */,
36
37
  ];
37
38
  var gan = ["갑", "을", "병", "정", "무", "기", "경", "신", "임", "계"];
38
39
  var ji = ["자", "축", "인", "묘", "진", "사", "오", "미", "신", "유", "술", "해"];
@@ -40,9 +41,9 @@ var BASE_YEAR$1 = 1890;
40
41
  var BASE_MONTH$1 = 1;
41
42
  var BASE_DAY$1 = 1;
42
43
  var BASE_VALUE$1 = BASE_YEAR$1 * 10000 + BASE_MONTH$1 * 100 + BASE_DAY$1;
43
- var MAX_YEAR$1 = 2049;
44
- var MAX_MONTH$1 = 12;
45
- var MAX_DAY$1 = 29;
44
+ var MAX_YEAR$1 = 2050;
45
+ var MAX_MONTH$1 = 11;
46
+ var MAX_DAY$1 = 18;
46
47
  var MAX_VALUE$1 = MAX_YEAR$1 * 10000 + MAX_MONTH$1 * 100 + MAX_DAY$1;
47
48
  var SMALL_MONTH_DAY = 29;
48
49
  var BIG_MONTH_DAY = 30;
@@ -53,7 +54,7 @@ var getYearData = function (year) {
53
54
  };
54
55
  /**
55
56
  * 해당 월 (평달)의 일 수를 반환합니다.
56
- * @param year 1890년 ~ 2049
57
+ * @param year 1890년 ~ 2050
57
58
  * @param month 1월 ~ 12월
58
59
  * @returns 월의 일 수 (29 또는 30)
59
60
  */
@@ -64,7 +65,7 @@ var getMonthDays$1 = function (year, month) {
64
65
  };
65
66
  /**
66
67
  * 해당 연도의 윤달을 반환합니다.
67
- * @param year 1890년 ~ 2049
68
+ * @param year 1890년 ~ 2050
68
69
  * @returns 윤달 월 (1월 ~ 12월), 없으면 0
69
70
  */
70
71
  var getLeapMonth = function (year) {
@@ -72,7 +73,7 @@ var getLeapMonth = function (year) {
72
73
  };
73
74
  /**
74
75
  * 해당 연도에 윤달이 있는지를 반환합니다.
75
- * @param year 1890년 ~ 2049
76
+ * @param year 1890년 ~ 2050
76
77
  * @return 윤달이 있으면 true
77
78
  */
78
79
  var hasLeapMonth = function (year) {
@@ -80,7 +81,7 @@ var hasLeapMonth = function (year) {
80
81
  };
81
82
  /**
82
83
  * 해당 월이 윤달인지를 반환합니다.
83
- * @param year 1890년 ~ 2049
84
+ * @param year 1890년 ~ 2050
84
85
  * @param month 1월 ~ 12월
85
86
  * @returns 윤달이면 true
86
87
  */
@@ -90,7 +91,7 @@ var isLeapMonth = function (year, month) {
90
91
  };
91
92
  /**
92
93
  * 해당 월 (윤달)의 일 수를 반환합니다.
93
- * @param year 1890년 ~ 2049
94
+ * @param year 1890년 ~ 2050
94
95
  * @param month 1월 ~ 12월
95
96
  * @returns 윤달의 일 수 (29 또는 30), 윤달이 아니면 0
96
97
  */
@@ -102,7 +103,7 @@ var getLeapMonthDays = function (year, month) {
102
103
  };
103
104
  /**
104
105
  * 해당 연도의 총 일 수를 반환합니다.
105
- * @param year 1890년 ~ 2049
106
+ * @param year 1890년 ~ 2050
106
107
  * @return 해당 연도의 총 일 수
107
108
  */
108
109
  var getYearDays$1 = function (year) {
@@ -118,7 +119,7 @@ for (var y$1 = BASE_YEAR$1 + 1; y$1 <= MAX_YEAR$1; y$1++) {
118
119
  }
119
120
  /**
120
121
  * 1890년부터 해당 연도 전까지의 누적 일 수를 반환합니다.
121
- * @param year 1890년 ~ 2049
122
+ * @param year 1890년 ~ 2050
122
123
  * @return 해당 연도 전까지의 누적 일 수
123
124
  */
124
125
  var getTotalDaysBeforeYear$1 = function (year) {
@@ -128,7 +129,7 @@ var getTotalDaysBeforeYear$1 = function (year) {
128
129
  };
129
130
  /**
130
131
  * 해당 연도 내에서 해당 월 (및 윤달 포함) 전까지의 누적 일 수를 반환합니다.
131
- * @param year 1890년 ~ 2049
132
+ * @param year 1890년 ~ 2050
132
133
  * @param month 1월 ~ 12월
133
134
  * @param isLeapMonth 대상이 윤달이면 true
134
135
  * @returns 해당 연도 내, 해당 월 전까지의 누적 일 수
@@ -152,7 +153,7 @@ var getTotalDaysBeforeMonth$1 = function (year, month, isLeapMonth) {
152
153
  };
153
154
  /**
154
155
  * 1890년부터 해당 연도, 월, 일 (및 윤달 포함) 까지의 누적 일 수를 반환합니다.
155
- * @param year 1890년 ~ 2049
156
+ * @param year 1890년 ~ 2050
156
157
  * @param month 1월 ~ 12월
157
158
  * @param day 일자
158
159
  * @param isLeapMonth 대상이 윤달이면 true
@@ -227,8 +228,46 @@ var isValidDate$1 = function (year, month, day, isLeapMonth) {
227
228
  var endDay = isLeapMonth ? getLeapMonthDays(year, month) : getMonthDays$1(year, month);
228
229
  return day <= endDay;
229
230
  };
231
+ /**
232
+ * 해당 월의 0-based 연속적인 월 인덱스를 반환합니다.
233
+ * @param year 1890년 ~ 2050년
234
+ * @param month 1월 ~ 12월
235
+ * @param isLeapMonth 대상이 윤달이면 true
236
+ * @returns 윤달이 있는 해는 0~12 (13개월), 없는 해는 0~11 (12개월)
237
+ */
238
+ var getMonthIndex = function (year, month, isLeapMonth) {
239
+ month = toInt(month);
240
+ var index = month;
241
+ if (hasLeapMonth(year)) {
242
+ var leapMonth = getLeapMonth(year);
243
+ if ((isLeapMonth && month === leapMonth) || month > leapMonth) {
244
+ index++;
245
+ }
246
+ }
247
+ return index - 1;
248
+ };
249
+ /**
250
+ * 0-based 연속적인 월 인덱스에 해당하는 월과 윤달 여부를 반환합니다.
251
+ * @param year 1890년 ~ 2050년
252
+ * @param monthIndex 윤달이 있는 해는 0~12 (13개월), 없는 해는 0~11 (12개월)
253
+ * @returns month (1~12)와 isLeapMonth 여부
254
+ */
255
+ var getMonthFromIndex = function (year, monthIndex) {
256
+ var leapMonth = getLeapMonth(year);
257
+ var isLeapMonth = false;
258
+ var index = monthIndex;
259
+ if (leapMonth > 0) {
260
+ if (index === leapMonth) {
261
+ isLeapMonth = true;
262
+ }
263
+ if (index >= leapMonth) {
264
+ index--;
265
+ }
266
+ }
267
+ return { month: index + 1, isLeapMonth: isLeapMonth };
268
+ };
230
269
 
231
- var LunarData = /*#__PURE__*/Object.freeze({
270
+ var LunarTable = /*#__PURE__*/Object.freeze({
232
271
  __proto__: null,
233
272
  BASE_YEAR: BASE_YEAR$1,
234
273
  BASE_MONTH: BASE_MONTH$1,
@@ -252,7 +291,9 @@ var LunarData = /*#__PURE__*/Object.freeze({
252
291
  getIljinByJulianDay: getIljinByJulianDay,
253
292
  getIljin: getIljin,
254
293
  isDateInRange: isDateInRange$1,
255
- isValidDate: isValidDate$1
294
+ isValidDate: isValidDate$1,
295
+ getMonthIndex: getMonthIndex,
296
+ getMonthFromIndex: getMonthFromIndex
256
297
  });
257
298
 
258
299
  var MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
@@ -264,8 +305,8 @@ var BASE_MONTH = 1;
264
305
  var BASE_DAY = 21;
265
306
  var BASE_VALUE = BASE_YEAR * 10000 + BASE_MONTH * 100 + BASE_DAY;
266
307
  var MAX_YEAR = 2050;
267
- var MAX_MONTH = 1;
268
- var MAX_DAY = 22;
308
+ var MAX_MONTH = 12;
309
+ var MAX_DAY = 31;
269
310
  var MAX_VALUE = MAX_YEAR * 10000 + MAX_MONTH * 100 + MAX_DAY;
270
311
  var totalDaysBeforeYear = {};
271
312
  var isLeapYear = function (year) {
@@ -347,7 +388,7 @@ var isValidDate = function (year, month, day) {
347
388
  return day <= endDay;
348
389
  };
349
390
 
350
- var SolarData = /*#__PURE__*/Object.freeze({
391
+ var SolarTable = /*#__PURE__*/Object.freeze({
351
392
  __proto__: null,
352
393
  BASE_YEAR: BASE_YEAR,
353
394
  BASE_MONTH: BASE_MONTH,
@@ -371,7 +412,7 @@ var SOLAR_LUNAR_DAY_DIFF = 20;
371
412
  var JULIAN_DAY_DIFF = 2411389;
372
413
  /**
373
414
  * 양력을 음력으로 변환합니다.
374
- * 양력 지원 날짜 범위: 1890년 1월 21일 ~ 2050년 122
415
+ * 양력 지원 날짜 범위: 1890년 1월 21일 ~ 2050년 1231
375
416
  * @param solYear 양력 연도
376
417
  * @param solMonth 양력 월
377
418
  * @param solDay 양력 일
@@ -384,36 +425,32 @@ var toLunar = function (solYear, solMonth, solDay) {
384
425
  if (!isDateInRange(solYear, solMonth, solDay)) {
385
426
  throw new RangeError("\uC9C0\uC6D0\uB418\uC9C0 \uC54A\uB294 \uB0A0\uC9DC\uC785\uB2C8\uB2E4. \uC785\uB825\uD55C \uB0A0\uC9DC: ".concat(solYear, "-").concat(solMonth, "-").concat(solDay));
386
427
  }
387
- var year = BASE_YEAR$1;
388
- var month = BASE_MONTH$1;
389
- var day = BASE_DAY$1 + getTotalDays(solYear, solMonth, solDay) - SOLAR_LUNAR_DAY_DIFF - 1;
390
- var julianDay = JULIAN_DAY_DIFF + day - 1;
391
- var dayOfWeek = (day + 1) % 7;
392
- var yearDays = getYearDays$1(year);
393
- while (day > yearDays) {
394
- year++;
395
- day -= yearDays;
396
- yearDays = getYearDays$1(year);
397
- }
398
- var isLeapMonth = false;
399
- var leapMonth = getLeapMonth(year);
400
- var monthDays = getMonthDays$1(year, month);
401
- while (day > monthDays) {
402
- day -= monthDays;
403
- isLeapMonth = false;
404
- if (month === leapMonth) {
405
- leapMonth = 0;
406
- monthDays = getLeapMonthDays(year, month);
407
- isLeapMonth = true;
408
- continue;
428
+ var year = Math.min(solYear, MAX_YEAR$1);
429
+ var month = solYear > MAX_YEAR$1 ? MAX_MONTH$1 : solMonth;
430
+ var day = 1;
431
+ var lunTotalDays = getTotalDays$1(year, month, day, true);
432
+ var solTotalDays = getTotalDays(solYear, solMonth, solDay);
433
+ var diffDays = solTotalDays - SOLAR_LUNAR_DAY_DIFF - lunTotalDays;
434
+ day += diffDays;
435
+ var day2 = solTotalDays - SOLAR_LUNAR_DAY_DIFF;
436
+ var julianDay = JULIAN_DAY_DIFF + day2 - 1;
437
+ var dayOfWeek = (day2 + 1) % 7;
438
+ var isLeapMonth = month === getLeapMonth(year);
439
+ var monthDays;
440
+ while (day < 1) {
441
+ if (isLeapMonth) {
442
+ isLeapMonth = false;
409
443
  }
410
- month++;
411
- if (month > 12) {
412
- month = 1;
413
- year++;
414
- leapMonth = getLeapMonth(year);
444
+ else {
445
+ month--;
446
+ if (month === 0) {
447
+ month = 12;
448
+ year--;
449
+ }
450
+ isLeapMonth = month === getLeapMonth(year);
415
451
  }
416
- monthDays = getMonthDays$1(year, month);
452
+ monthDays = isLeapMonth ? getLeapMonthDays(year, month) : getMonthDays$1(year, month);
453
+ day += monthDays;
417
454
  }
418
455
  return {
419
456
  year: year,
@@ -429,7 +466,7 @@ var toLunar = function (solYear, solMonth, solDay) {
429
466
  };
430
467
  /**
431
468
  * 음력을 양력으로 변환합니다.
432
- * 음력 지원 날짜 범위: 1890년 1월 1일 ~ 20491229
469
+ * 음력 지원 날짜 범위: 1890년 1월 1일 ~ 20501118
433
470
  * @param lunYear 음력 연도
434
471
  * @param lunMonth 음력 월
435
472
  * @param lunDay 음력 일
@@ -443,15 +480,12 @@ var toSolar = function (lunYear, lunMonth, lunDay, isLeapMonth) {
443
480
  if (!isDateInRange$1(lunYear, lunMonth, lunDay)) {
444
481
  throw new RangeError("\uC9C0\uC6D0\uB418\uC9C0 \uC54A\uB294 \uB0A0\uC9DC\uC785\uB2C8\uB2E4. \uC785\uB825\uD55C \uB0A0\uC9DC: ".concat(lunYear, "-").concat(lunMonth, "-").concat(lunDay));
445
482
  }
446
- var year = BASE_YEAR;
447
- var month = BASE_MONTH;
448
- var day = BASE_DAY + getTotalDays$1(lunYear, lunMonth, lunDay, isLeapMonth) - 1;
449
- var yearDays = getYearDays(year);
450
- while (day > yearDays) {
451
- day -= yearDays;
452
- year++;
453
- yearDays = getYearDays(year);
454
- }
483
+ var lunTotalDays = getTotalDays$1(lunYear, lunMonth, lunDay, isLeapMonth);
484
+ var solTotalDays = getTotalDays(lunYear, lunMonth, lunDay);
485
+ var diffDays = lunTotalDays - (solTotalDays - SOLAR_LUNAR_DAY_DIFF);
486
+ var year = lunYear;
487
+ var month = lunMonth;
488
+ var day = lunDay + diffDays;
455
489
  var monthDays = getMonthDays(year, month);
456
490
  while (day > monthDays) {
457
491
  day -= monthDays;
@@ -464,8 +498,12 @@ var toSolar = function (lunYear, lunMonth, lunDay, isLeapMonth) {
464
498
  }
465
499
  return { year: year, month: month, day: day };
466
500
  };
501
+ /** @deprecated `LunarData`는 `LunarTable`로 이름이 변경되었습니다. */
502
+ var LunarData = LunarTable;
503
+ /** @deprecated `SolarData`는 `SolarTable`로 이름이 변경되었습니다. */
504
+ var SolarData = SolarTable;
467
505
 
468
- var korLunar = { toLunar: toLunar, toSolar: toSolar, LunarData: LunarData, SolarData: SolarData };
506
+ var korLunar = { toLunar: toLunar, toSolar: toSolar, LunarTable: LunarTable, SolarTable: SolarTable, LunarData: LunarData, SolarData: SolarData };
469
507
 
470
- export { LunarData, SolarData, korLunar as default, toLunar, toSolar };
508
+ export { LunarData, LunarTable, SolarData, SolarTable, korLunar as default, toLunar, toSolar };
471
509
  //# sourceMappingURL=kor-lunar.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"kor-lunar.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"kor-lunar.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/kor-lunar.js CHANGED
@@ -37,6 +37,7 @@ var LUN_TABLE = [
37
37
  /*2020*/ 0x3004a9d, 0x2c40556, 0x2c60ab5, 0x3002ad6, 0x2c406d2, 0x3006765, 0x2c60ea5, 0x2c40e4a, 0x2fe5656, 0x2c60c9b,
38
38
  /*2030*/ 0x2c4055a, 0x300356d, 0x2c60b69, 0x300bf52, 0x2c40752, 0x2c40b25, 0x3016b0b, 0x2c40a4b, 0x2c404ab, 0x30052bb,
39
39
  /*2040*/ 0x2c6056d, 0x2c60b69, 0x3002daa, 0x2c40d92, 0x3007ea5, 0x2c40d25, 0x2c40a4d, 0x3015a4d, 0x2c402b6, 0x2c605b5,
40
+ /*2050*/ 0x00136d1 /* 11월 18일 까지라 데이터 부족 */,
40
41
  ];
41
42
  var gan = ["갑", "을", "병", "정", "무", "기", "경", "신", "임", "계"];
42
43
  var ji = ["자", "축", "인", "묘", "진", "사", "오", "미", "신", "유", "술", "해"];
@@ -44,9 +45,9 @@ var BASE_YEAR$1 = 1890;
44
45
  var BASE_MONTH$1 = 1;
45
46
  var BASE_DAY$1 = 1;
46
47
  var BASE_VALUE$1 = BASE_YEAR$1 * 10000 + BASE_MONTH$1 * 100 + BASE_DAY$1;
47
- var MAX_YEAR$1 = 2049;
48
- var MAX_MONTH$1 = 12;
49
- var MAX_DAY$1 = 29;
48
+ var MAX_YEAR$1 = 2050;
49
+ var MAX_MONTH$1 = 11;
50
+ var MAX_DAY$1 = 18;
50
51
  var MAX_VALUE$1 = MAX_YEAR$1 * 10000 + MAX_MONTH$1 * 100 + MAX_DAY$1;
51
52
  var SMALL_MONTH_DAY = 29;
52
53
  var BIG_MONTH_DAY = 30;
@@ -57,7 +58,7 @@ var getYearData = function (year) {
57
58
  };
58
59
  /**
59
60
  * 해당 월 (평달)의 일 수를 반환합니다.
60
- * @param year 1890년 ~ 2049
61
+ * @param year 1890년 ~ 2050
61
62
  * @param month 1월 ~ 12월
62
63
  * @returns 월의 일 수 (29 또는 30)
63
64
  */
@@ -68,7 +69,7 @@ var getMonthDays$1 = function (year, month) {
68
69
  };
69
70
  /**
70
71
  * 해당 연도의 윤달을 반환합니다.
71
- * @param year 1890년 ~ 2049
72
+ * @param year 1890년 ~ 2050
72
73
  * @returns 윤달 월 (1월 ~ 12월), 없으면 0
73
74
  */
74
75
  var getLeapMonth = function (year) {
@@ -76,7 +77,7 @@ var getLeapMonth = function (year) {
76
77
  };
77
78
  /**
78
79
  * 해당 연도에 윤달이 있는지를 반환합니다.
79
- * @param year 1890년 ~ 2049
80
+ * @param year 1890년 ~ 2050
80
81
  * @return 윤달이 있으면 true
81
82
  */
82
83
  var hasLeapMonth = function (year) {
@@ -84,7 +85,7 @@ var hasLeapMonth = function (year) {
84
85
  };
85
86
  /**
86
87
  * 해당 월이 윤달인지를 반환합니다.
87
- * @param year 1890년 ~ 2049
88
+ * @param year 1890년 ~ 2050
88
89
  * @param month 1월 ~ 12월
89
90
  * @returns 윤달이면 true
90
91
  */
@@ -94,7 +95,7 @@ var isLeapMonth = function (year, month) {
94
95
  };
95
96
  /**
96
97
  * 해당 월 (윤달)의 일 수를 반환합니다.
97
- * @param year 1890년 ~ 2049
98
+ * @param year 1890년 ~ 2050
98
99
  * @param month 1월 ~ 12월
99
100
  * @returns 윤달의 일 수 (29 또는 30), 윤달이 아니면 0
100
101
  */
@@ -106,7 +107,7 @@ var getLeapMonthDays = function (year, month) {
106
107
  };
107
108
  /**
108
109
  * 해당 연도의 총 일 수를 반환합니다.
109
- * @param year 1890년 ~ 2049
110
+ * @param year 1890년 ~ 2050
110
111
  * @return 해당 연도의 총 일 수
111
112
  */
112
113
  var getYearDays$1 = function (year) {
@@ -122,7 +123,7 @@ for (var y$1 = BASE_YEAR$1 + 1; y$1 <= MAX_YEAR$1; y$1++) {
122
123
  }
123
124
  /**
124
125
  * 1890년부터 해당 연도 전까지의 누적 일 수를 반환합니다.
125
- * @param year 1890년 ~ 2049
126
+ * @param year 1890년 ~ 2050
126
127
  * @return 해당 연도 전까지의 누적 일 수
127
128
  */
128
129
  var getTotalDaysBeforeYear$1 = function (year) {
@@ -132,7 +133,7 @@ var getTotalDaysBeforeYear$1 = function (year) {
132
133
  };
133
134
  /**
134
135
  * 해당 연도 내에서 해당 월 (및 윤달 포함) 전까지의 누적 일 수를 반환합니다.
135
- * @param year 1890년 ~ 2049
136
+ * @param year 1890년 ~ 2050
136
137
  * @param month 1월 ~ 12월
137
138
  * @param isLeapMonth 대상이 윤달이면 true
138
139
  * @returns 해당 연도 내, 해당 월 전까지의 누적 일 수
@@ -156,7 +157,7 @@ var getTotalDaysBeforeMonth$1 = function (year, month, isLeapMonth) {
156
157
  };
157
158
  /**
158
159
  * 1890년부터 해당 연도, 월, 일 (및 윤달 포함) 까지의 누적 일 수를 반환합니다.
159
- * @param year 1890년 ~ 2049
160
+ * @param year 1890년 ~ 2050
160
161
  * @param month 1월 ~ 12월
161
162
  * @param day 일자
162
163
  * @param isLeapMonth 대상이 윤달이면 true
@@ -231,8 +232,46 @@ var isValidDate$1 = function (year, month, day, isLeapMonth) {
231
232
  var endDay = isLeapMonth ? getLeapMonthDays(year, month) : getMonthDays$1(year, month);
232
233
  return day <= endDay;
233
234
  };
235
+ /**
236
+ * 해당 월의 0-based 연속적인 월 인덱스를 반환합니다.
237
+ * @param year 1890년 ~ 2050년
238
+ * @param month 1월 ~ 12월
239
+ * @param isLeapMonth 대상이 윤달이면 true
240
+ * @returns 윤달이 있는 해는 0~12 (13개월), 없는 해는 0~11 (12개월)
241
+ */
242
+ var getMonthIndex = function (year, month, isLeapMonth) {
243
+ month = toInt(month);
244
+ var index = month;
245
+ if (hasLeapMonth(year)) {
246
+ var leapMonth = getLeapMonth(year);
247
+ if ((isLeapMonth && month === leapMonth) || month > leapMonth) {
248
+ index++;
249
+ }
250
+ }
251
+ return index - 1;
252
+ };
253
+ /**
254
+ * 0-based 연속적인 월 인덱스에 해당하는 월과 윤달 여부를 반환합니다.
255
+ * @param year 1890년 ~ 2050년
256
+ * @param monthIndex 윤달이 있는 해는 0~12 (13개월), 없는 해는 0~11 (12개월)
257
+ * @returns month (1~12)와 isLeapMonth 여부
258
+ */
259
+ var getMonthFromIndex = function (year, monthIndex) {
260
+ var leapMonth = getLeapMonth(year);
261
+ var isLeapMonth = false;
262
+ var index = monthIndex;
263
+ if (leapMonth > 0) {
264
+ if (index === leapMonth) {
265
+ isLeapMonth = true;
266
+ }
267
+ if (index >= leapMonth) {
268
+ index--;
269
+ }
270
+ }
271
+ return { month: index + 1, isLeapMonth: isLeapMonth };
272
+ };
234
273
 
235
- var LunarData = /*#__PURE__*/Object.freeze({
274
+ var LunarTable = /*#__PURE__*/Object.freeze({
236
275
  __proto__: null,
237
276
  BASE_YEAR: BASE_YEAR$1,
238
277
  BASE_MONTH: BASE_MONTH$1,
@@ -256,7 +295,9 @@ var LunarData = /*#__PURE__*/Object.freeze({
256
295
  getIljinByJulianDay: getIljinByJulianDay,
257
296
  getIljin: getIljin,
258
297
  isDateInRange: isDateInRange$1,
259
- isValidDate: isValidDate$1
298
+ isValidDate: isValidDate$1,
299
+ getMonthIndex: getMonthIndex,
300
+ getMonthFromIndex: getMonthFromIndex
260
301
  });
261
302
 
262
303
  var MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
@@ -268,8 +309,8 @@ var BASE_MONTH = 1;
268
309
  var BASE_DAY = 21;
269
310
  var BASE_VALUE = BASE_YEAR * 10000 + BASE_MONTH * 100 + BASE_DAY;
270
311
  var MAX_YEAR = 2050;
271
- var MAX_MONTH = 1;
272
- var MAX_DAY = 22;
312
+ var MAX_MONTH = 12;
313
+ var MAX_DAY = 31;
273
314
  var MAX_VALUE = MAX_YEAR * 10000 + MAX_MONTH * 100 + MAX_DAY;
274
315
  var totalDaysBeforeYear = {};
275
316
  var isLeapYear = function (year) {
@@ -351,7 +392,7 @@ var isValidDate = function (year, month, day) {
351
392
  return day <= endDay;
352
393
  };
353
394
 
354
- var SolarData = /*#__PURE__*/Object.freeze({
395
+ var SolarTable = /*#__PURE__*/Object.freeze({
355
396
  __proto__: null,
356
397
  BASE_YEAR: BASE_YEAR,
357
398
  BASE_MONTH: BASE_MONTH,
@@ -375,7 +416,7 @@ var SOLAR_LUNAR_DAY_DIFF = 20;
375
416
  var JULIAN_DAY_DIFF = 2411389;
376
417
  /**
377
418
  * 양력을 음력으로 변환합니다.
378
- * 양력 지원 날짜 범위: 1890년 1월 21일 ~ 2050년 122
419
+ * 양력 지원 날짜 범위: 1890년 1월 21일 ~ 2050년 1231
379
420
  * @param solYear 양력 연도
380
421
  * @param solMonth 양력 월
381
422
  * @param solDay 양력 일
@@ -388,36 +429,32 @@ var toLunar = function (solYear, solMonth, solDay) {
388
429
  if (!isDateInRange(solYear, solMonth, solDay)) {
389
430
  throw new RangeError("\uC9C0\uC6D0\uB418\uC9C0 \uC54A\uB294 \uB0A0\uC9DC\uC785\uB2C8\uB2E4. \uC785\uB825\uD55C \uB0A0\uC9DC: ".concat(solYear, "-").concat(solMonth, "-").concat(solDay));
390
431
  }
391
- var year = BASE_YEAR$1;
392
- var month = BASE_MONTH$1;
393
- var day = BASE_DAY$1 + getTotalDays(solYear, solMonth, solDay) - SOLAR_LUNAR_DAY_DIFF - 1;
394
- var julianDay = JULIAN_DAY_DIFF + day - 1;
395
- var dayOfWeek = (day + 1) % 7;
396
- var yearDays = getYearDays$1(year);
397
- while (day > yearDays) {
398
- year++;
399
- day -= yearDays;
400
- yearDays = getYearDays$1(year);
401
- }
402
- var isLeapMonth = false;
403
- var leapMonth = getLeapMonth(year);
404
- var monthDays = getMonthDays$1(year, month);
405
- while (day > monthDays) {
406
- day -= monthDays;
407
- isLeapMonth = false;
408
- if (month === leapMonth) {
409
- leapMonth = 0;
410
- monthDays = getLeapMonthDays(year, month);
411
- isLeapMonth = true;
412
- continue;
432
+ var year = Math.min(solYear, MAX_YEAR$1);
433
+ var month = solYear > MAX_YEAR$1 ? MAX_MONTH$1 : solMonth;
434
+ var day = 1;
435
+ var lunTotalDays = getTotalDays$1(year, month, day, true);
436
+ var solTotalDays = getTotalDays(solYear, solMonth, solDay);
437
+ var diffDays = solTotalDays - SOLAR_LUNAR_DAY_DIFF - lunTotalDays;
438
+ day += diffDays;
439
+ var day2 = solTotalDays - SOLAR_LUNAR_DAY_DIFF;
440
+ var julianDay = JULIAN_DAY_DIFF + day2 - 1;
441
+ var dayOfWeek = (day2 + 1) % 7;
442
+ var isLeapMonth = month === getLeapMonth(year);
443
+ var monthDays;
444
+ while (day < 1) {
445
+ if (isLeapMonth) {
446
+ isLeapMonth = false;
413
447
  }
414
- month++;
415
- if (month > 12) {
416
- month = 1;
417
- year++;
418
- leapMonth = getLeapMonth(year);
448
+ else {
449
+ month--;
450
+ if (month === 0) {
451
+ month = 12;
452
+ year--;
453
+ }
454
+ isLeapMonth = month === getLeapMonth(year);
419
455
  }
420
- monthDays = getMonthDays$1(year, month);
456
+ monthDays = isLeapMonth ? getLeapMonthDays(year, month) : getMonthDays$1(year, month);
457
+ day += monthDays;
421
458
  }
422
459
  return {
423
460
  year: year,
@@ -433,7 +470,7 @@ var toLunar = function (solYear, solMonth, solDay) {
433
470
  };
434
471
  /**
435
472
  * 음력을 양력으로 변환합니다.
436
- * 음력 지원 날짜 범위: 1890년 1월 1일 ~ 20491229
473
+ * 음력 지원 날짜 범위: 1890년 1월 1일 ~ 20501118
437
474
  * @param lunYear 음력 연도
438
475
  * @param lunMonth 음력 월
439
476
  * @param lunDay 음력 일
@@ -447,15 +484,12 @@ var toSolar = function (lunYear, lunMonth, lunDay, isLeapMonth) {
447
484
  if (!isDateInRange$1(lunYear, lunMonth, lunDay)) {
448
485
  throw new RangeError("\uC9C0\uC6D0\uB418\uC9C0 \uC54A\uB294 \uB0A0\uC9DC\uC785\uB2C8\uB2E4. \uC785\uB825\uD55C \uB0A0\uC9DC: ".concat(lunYear, "-").concat(lunMonth, "-").concat(lunDay));
449
486
  }
450
- var year = BASE_YEAR;
451
- var month = BASE_MONTH;
452
- var day = BASE_DAY + getTotalDays$1(lunYear, lunMonth, lunDay, isLeapMonth) - 1;
453
- var yearDays = getYearDays(year);
454
- while (day > yearDays) {
455
- day -= yearDays;
456
- year++;
457
- yearDays = getYearDays(year);
458
- }
487
+ var lunTotalDays = getTotalDays$1(lunYear, lunMonth, lunDay, isLeapMonth);
488
+ var solTotalDays = getTotalDays(lunYear, lunMonth, lunDay);
489
+ var diffDays = lunTotalDays - (solTotalDays - SOLAR_LUNAR_DAY_DIFF);
490
+ var year = lunYear;
491
+ var month = lunMonth;
492
+ var day = lunDay + diffDays;
459
493
  var monthDays = getMonthDays(year, month);
460
494
  while (day > monthDays) {
461
495
  day -= monthDays;
@@ -468,11 +502,17 @@ var toSolar = function (lunYear, lunMonth, lunDay, isLeapMonth) {
468
502
  }
469
503
  return { year: year, month: month, day: day };
470
504
  };
505
+ /** @deprecated `LunarData`는 `LunarTable`로 이름이 변경되었습니다. */
506
+ var LunarData = LunarTable;
507
+ /** @deprecated `SolarData`는 `SolarTable`로 이름이 변경되었습니다. */
508
+ var SolarData = SolarTable;
471
509
 
472
- var korLunar = { toLunar: toLunar, toSolar: toSolar, LunarData: LunarData, SolarData: SolarData };
510
+ var korLunar = { toLunar: toLunar, toSolar: toSolar, LunarTable: LunarTable, SolarTable: SolarTable, LunarData: LunarData, SolarData: SolarData };
473
511
 
474
512
  exports.LunarData = LunarData;
513
+ exports.LunarTable = LunarTable;
475
514
  exports.SolarData = SolarData;
515
+ exports.SolarTable = SolarTable;
476
516
  exports["default"] = korLunar;
477
517
  exports.toLunar = toLunar;
478
518
  exports.toSolar = toSolar;
@@ -1 +1 @@
1
- {"version":3,"file":"kor-lunar.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"kor-lunar.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,2 +1,2 @@
1
- var korLunar=function(n){"use strict";var r=function(n){return"string"==typeof n||"number"==typeof n?~~n:n},t=[50342582,46534058,50360036,46403236,46402890,50222421,46533271,46400854,50345309,46533333,50367442,46401362,46534309,50223914,46401099,46533275,50416294,46400874,46533465,50342826,46401362,50359717,46402341,46402123,50354523,46533293,46400874,50341301,46533545,50363858,46402962,46402853,50355501,46401878,46400181,50481885,46401236,46534057,50343626,46403218,50226854,46400807,46533207,50420054,46533338,46401236,50411345,46401353,50428691,46402195,46400811,50423067,46532973,46533482,50417060,46402468,46402377,50343243,46402197,50363051,46400813,46533293,50420394,46534066,46402980,50413217,46402890,50367893,46402198,46400854,50357621,46533333,46401234,50349909,46534309,46403146,50214478,46533275,50363094,46400874,46533465,50355122,46401362,46401317,50350891,46402123,50366891,46400173,46531947,50423209,46534057,46402962,50351509,46402853,50376269,46402134,46400182,50490093,46401236,46534057,50355922,46403218,46402854,50214190,46533207,50366902,46533466,46401236,50354025,46401353,46401171,50350743,46400811,46533211,50342574,46400362,50494933,46402468,46402377,50355539,46402197,46400813,50410797,46533293,50371498,46400978,46534053,50355882,46402890,46402197,50350749,46400854,46533301,50342614,46401234,50358117,46534309,46403146,50222678,46533787,46400858,50345325,46533481,50380626,46401362,46402341,50424587,46402123,46400683,50352827,46531949,46533481,50343338,46402962,50364069,46402853,46402125,50420301,46400182,46532021],e=["갑","을","병","정","무","기","경","신","임","계"],a=["자","축","인","묘","진","사","오","미","신","유","술","해"],o=1890,u=18900101,f=2049,i=20491229,c={},l=function(n){return n=r(n),t[n-o]},g=function(n,t){return t=r(t),0===(l(n)>>t-1&1)?29:30},A=function(n){return l(n)>>12&15},_=function(n,t){return(t=r(t))===A(n)},D=function(n,r){return _(n,r)?0===(l(n)>>16&1)?29:30:0},s=function(n){return l(n)>>17&511};c[1890]=0;for(var h=1891;h<=f;h++)c[h]=c[h-1]+s(h-1);var y=function(n){return n=r(n),c[n]},M=function(n,t,e){t=r(t);for(var a=0,o=1;o<t;o++)a+=g(n,o),o===A(n)&&(a+=D(n,o));var u=A(n);return e&&u===t&&(a+=g(n,t)),a},E=function(n,t,e,a){return e=r(e),y(n)+M(n,t,a)+e},v=function(n){return n=r(n),e[(n+6)%e.length]+a[(n+8)%a.length]},L=function(n,t){return n=r(n),t=r(t),e[(2*n+t+3)%e.length]+a[(t+1)%a.length]},B=function(n){return n=r(n),e[(n-1)%e.length]+a[(n+1)%a.length]},S=function(n,t,e){var a=1e4*(n=r(n))+100*(t=r(t))+(e=r(e));return a>=u&&a<=i},Y=Object.freeze({__proto__:null,BASE_YEAR:o,BASE_MONTH:1,BASE_DAY:1,BASE_VALUE:u,MAX_YEAR:f,MAX_MONTH:12,MAX_DAY:29,MAX_VALUE:i,getMonthDays:g,getLeapMonth:A,hasLeapMonth:function(n){return 0!==A(n)},isLeapMonth:_,getLeapMonthDays:D,getYearDays:s,getTotalDaysBeforeYear:y,getTotalDaysBeforeMonth:M,getTotalDays:E,getSecha:v,getWolgeon:L,getIljinByJulianDay:B,getIljin:function(n,r,t,e){var a=E(n,r,t,e);return B(a-1)},isDateInRange:S,isValidDate:function(n,t,e,a){if(n=r(n),t=r(t),e=r(e),n<o||n>f)return!1;if(n===o){if(t<1)return!1;if(1===t&&e<1)return!1}if(n===f){if(t>12)return!1;if(12===t&&e>29)return!1}return!(t<1||t>12)&&(!(e<1)&&e<=(a?D(n,t):g(n,t)))}}),p=[31,28,31,30,31,30,31,31,30,31,30,31],T=1890,d=18900121,O=2050,R=20500122,X={},j=function(n){return(n=r(n))%4==0&&n%100!=0||n%400==0},V=function(n,t){return 2===(t=r(t))&&j(n)?29:p[t-1]},w=function(n){return j(n)?366:365};X[1890]=0;for(var b=1891;b<=O;b++)X[b]=X[b-1]+w(b-1);var H=function(n){return n=r(n),X[n]},I=function(n,r){for(var t=0,e=1;e<r;e++)t+=V(n,e);return t},N=function(n,r,t){return H(n)+I(n,r)+t},U=function(n,t,e){var a=1e4*(n=r(n))+100*(t=r(t))+(e=r(e));return a>=d&&a<=R},m=Object.freeze({__proto__:null,BASE_YEAR:T,BASE_MONTH:1,BASE_DAY:21,BASE_VALUE:d,MAX_YEAR:O,MAX_MONTH:1,MAX_DAY:22,MAX_VALUE:R,isLeapYear:j,getMonthDays:V,getYearDays:w,getTotalDaysBeforeYear:H,getTotalDaysBeforeMonth:I,getTotalDays:N,isDateInRange:U,isValidDate:function(n,t,e){if(n=r(n),t=r(t),e=r(e),n<T||n>O)return!1;if(n===T){if(t<1)return!1;if(1===t&&e<21)return!1}if(n===O){if(t>1)return!1;if(1===t&&e>22)return!1}return!(t<1||t>12)&&(!(e<1)&&e<=V(n,t))}}),k=function(n,t,e){if(n=r(n),t=r(t),e=r(e),!U(n,t,e))throw new RangeError("지원되지 않는 날짜입니다. 입력한 날짜: ".concat(n,"-").concat(t,"-").concat(e));for(var a=o,u=1,f=1+N(n,t,e)-20-1,i=2411389+f-1,c=(f+1)%7,l=s(a);f>l;)a++,f-=l,l=s(a);for(var _=!1,h=A(a),y=g(a,u);f>y;)f-=y,_=!1,u!==h?(++u>12&&(u=1,a++,h=A(a)),y=g(a,u)):(h=0,y=D(a,u),_=!0);return{year:a,month:u,day:f,isLeapMonth:_,secha:v(a),wolgeon:_?"":L(a,u),iljin:B(i),julianDay:i,dayOfWeek:c}},z=function(n,t,e,a){if(n=r(n),t=r(t),e=r(e),!S(n,t,e))throw new RangeError("지원되지 않는 날짜입니다. 입력한 날짜: ".concat(n,"-").concat(t,"-").concat(e));for(var o=T,u=1,f=21+E(n,t,e,a)-1,i=w(o);f>i;)f-=i,o++,i=w(o);for(var c=V(o,u);f>c;)f-=c,++u>12&&(u=1,o++),c=V(o,u);return{year:o,month:u,day:f}},W={toLunar:k,toSolar:z,LunarData:Y,SolarData:m};return n.LunarData=Y,n.SolarData=m,n.default=W,n.toLunar=k,n.toSolar=z,Object.defineProperty(n,"__esModule",{value:!0}),n}({});
1
+ var korLunar=function(n){"use strict";var t=function(n){return"string"==typeof n||"number"==typeof n?~~n:n},r=[50342582,46534058,50360036,46403236,46402890,50222421,46533271,46400854,50345309,46533333,50367442,46401362,46534309,50223914,46401099,46533275,50416294,46400874,46533465,50342826,46401362,50359717,46402341,46402123,50354523,46533293,46400874,50341301,46533545,50363858,46402962,46402853,50355501,46401878,46400181,50481885,46401236,46534057,50343626,46403218,50226854,46400807,46533207,50420054,46533338,46401236,50411345,46401353,50428691,46402195,46400811,50423067,46532973,46533482,50417060,46402468,46402377,50343243,46402197,50363051,46400813,46533293,50420394,46534066,46402980,50413217,46402890,50367893,46402198,46400854,50357621,46533333,46401234,50349909,46534309,46403146,50214478,46533275,50363094,46400874,46533465,50355122,46401362,46401317,50350891,46402123,50366891,46400173,46531947,50423209,46534057,46402962,50351509,46402853,50376269,46402134,46400182,50490093,46401236,46534057,50355922,46403218,46402854,50214190,46533207,50366902,46533466,46401236,50354025,46401353,46401171,50350743,46400811,46533211,50342574,46400362,50494933,46402468,46402377,50355539,46402197,46400813,50410797,46533293,50371498,46400978,46534053,50355882,46402890,46402197,50350749,46400854,46533301,50342614,46401234,50358117,46534309,46403146,50222678,46533787,46400858,50345325,46533481,50380626,46401362,46402341,50424587,46402123,46400683,50352827,46531949,46533481,50343338,46402962,50364069,46402853,46402125,50420301,46400182,46532021,79569],e=["갑","을","병","정","무","기","경","신","임","계"],a=["자","축","인","묘","진","사","오","미","신","유","술","해"],o=1890,u=18900101,i=2050,f=20501118,c={},l=function(n){return n=t(n),r[n-o]},g=function(n,r){return r=t(r),0===(l(n)>>r-1&1)?29:30},A=function(n){return l(n)>>12&15},h=function(n){return 0!==A(n)},M=function(n,r){return(r=t(r))===A(n)},_=function(n,t){return M(n,t)?0===(l(n)>>16&1)?29:30:0},s=function(n){return l(n)>>17&511};c[1890]=0;for(var D=1891;D<=i;D++)c[D]=c[D-1]+s(D-1);var y=function(n){return n=t(n),c[n]},v=function(n,r,e){r=t(r);for(var a=0,o=1;o<r;o++)a+=g(n,o),o===A(n)&&(a+=_(n,o));var u=A(n);return e&&u===r&&(a+=g(n,r)),a},E=function(n,r,e,a){return e=t(e),y(n)+v(n,r,a)+e},L=function(n){return n=t(n),e[(n+6)%e.length]+a[(n+8)%a.length]},S=function(n,r){return n=t(n),r=t(r),e[(2*n+r+3)%e.length]+a[(r+1)%a.length]},T=function(n){return n=t(n),e[(n-1)%e.length]+a[(n+1)%a.length]},B=function(n,r,e){var a=1e4*(n=t(n))+100*(r=t(r))+(e=t(e));return a>=u&&a<=f},Y=Object.freeze({__proto__:null,BASE_YEAR:o,BASE_MONTH:1,BASE_DAY:1,BASE_VALUE:u,MAX_YEAR:i,MAX_MONTH:11,MAX_DAY:18,MAX_VALUE:f,getMonthDays:g,getLeapMonth:A,hasLeapMonth:h,isLeapMonth:M,getLeapMonthDays:_,getYearDays:s,getTotalDaysBeforeYear:y,getTotalDaysBeforeMonth:v,getTotalDays:E,getSecha:L,getWolgeon:S,getIljinByJulianDay:T,getIljin:function(n,t,r,e){var a=E(n,t,r,e);return T(a-1)},isDateInRange:B,isValidDate:function(n,r,e,a){if(n=t(n),r=t(r),e=t(e),n<o||n>i)return!1;if(n===o){if(r<1)return!1;if(1===r&&e<1)return!1}if(n===i){if(r>11)return!1;if(11===r&&e>18)return!1}return!(r<1||r>12)&&(!(e<1)&&e<=(a?_(n,r):g(n,r)))},getMonthIndex:function(n,r,e){var a=r=t(r);if(h(n)){var o=A(n);(e&&r===o||r>o)&&a++}return a-1},getMonthFromIndex:function(n,t){var r=A(n),e=!1,a=t;return r>0&&(a===r&&(e=!0),a>=r&&a--),{month:a+1,isLeapMonth:e}}}),p=[31,28,31,30,31,30,31,31,30,31,30,31],d=1890,b=18900121,O=2050,R=20501231,X={},j=function(n){return(n=t(n))%4==0&&n%100!=0||n%400==0},m=function(n,r){return 2===(r=t(r))&&j(n)?29:p[r-1]},I=function(n){return j(n)?366:365};X[1890]=0;for(var V=1891;V<=O;V++)X[V]=X[V-1]+I(V-1);var w=function(n){return n=t(n),X[n]},H=function(n,t){for(var r=0,e=1;e<t;e++)r+=m(n,e);return r},N=function(n,t,r){return w(n)+H(n,t)+r},U=function(n,r,e){var a=1e4*(n=t(n))+100*(r=t(r))+(e=t(e));return a>=b&&a<=R},k=Object.freeze({__proto__:null,BASE_YEAR:d,BASE_MONTH:1,BASE_DAY:21,BASE_VALUE:b,MAX_YEAR:O,MAX_MONTH:12,MAX_DAY:31,MAX_VALUE:R,isLeapYear:j,getMonthDays:m,getYearDays:I,getTotalDaysBeforeYear:w,getTotalDaysBeforeMonth:H,getTotalDays:N,isDateInRange:U,isValidDate:function(n,r,e){if(n=t(n),r=t(r),e=t(e),n<d||n>O)return!1;if(n===d){if(r<1)return!1;if(1===r&&e<21)return!1}if(n===O){if(r>12)return!1;if(12===r&&e>31)return!1}return!(r<1||r>12)&&(!(e<1)&&e<=m(n,r))}}),x=function(n,r,e){if(n=t(n),r=t(r),e=t(e),!U(n,r,e))throw new RangeError("지원되지 않는 날짜입니다. 입력한 날짜: ".concat(n,"-").concat(r,"-").concat(e));var a=Math.min(n,i),o=n>i?11:r,u=1,f=E(a,o,u,!0),c=N(n,r,e);u+=c-20-f;for(var l=c-20,h=2411389+l-1,M=(l+1)%7,s=o===A(a);u<1;)s?s=!1:(0===--o&&(o=12,a--),s=o===A(a)),u+=s?_(a,o):g(a,o);return{year:a,month:o,day:u,isLeapMonth:s,secha:L(a),wolgeon:s?"":S(a,o),iljin:T(h),julianDay:h,dayOfWeek:M}},z=function(n,r,e,a){if(n=t(n),r=t(r),e=t(e),!B(n,r,e))throw new RangeError("지원되지 않는 날짜입니다. 입력한 날짜: ".concat(n,"-").concat(r,"-").concat(e));for(var o=n,u=r,i=e+(E(n,r,e,a)-(N(n,r,e)-20)),f=m(o,u);i>f;)i-=f,++u>12&&(u=1,o++),f=m(o,u);return{year:o,month:u,day:i}},W=Y,F=k,J={toLunar:x,toSolar:z,LunarTable:Y,SolarTable:k,LunarData:W,SolarData:F};return n.LunarData=W,n.LunarTable=Y,n.SolarData=F,n.SolarTable=k,n.default=J,n.toLunar=x,n.toSolar=z,Object.defineProperty(n,"__esModule",{value:!0}),n}({});
2
2
  //# sourceMappingURL=kor-lunar.min.js.map
@@ -2,58 +2,58 @@ export declare const BASE_YEAR = 1890;
2
2
  export declare const BASE_MONTH = 1;
3
3
  export declare const BASE_DAY = 1;
4
4
  export declare const BASE_VALUE: number;
5
- export declare const MAX_YEAR = 2049;
6
- export declare const MAX_MONTH = 12;
7
- export declare const MAX_DAY = 29;
5
+ export declare const MAX_YEAR = 2050;
6
+ export declare const MAX_MONTH = 11;
7
+ export declare const MAX_DAY = 18;
8
8
  export declare const MAX_VALUE: number;
9
9
  /**
10
10
  * 해당 월 (평달)의 일 수를 반환합니다.
11
- * @param year 1890년 ~ 2049
11
+ * @param year 1890년 ~ 2050
12
12
  * @param month 1월 ~ 12월
13
13
  * @returns 월의 일 수 (29 또는 30)
14
14
  */
15
15
  export declare const getMonthDays: (year: number, month: number) => number;
16
16
  /**
17
17
  * 해당 연도의 윤달을 반환합니다.
18
- * @param year 1890년 ~ 2049
18
+ * @param year 1890년 ~ 2050
19
19
  * @returns 윤달 월 (1월 ~ 12월), 없으면 0
20
20
  */
21
21
  export declare const getLeapMonth: (year: number) => number;
22
22
  /**
23
23
  * 해당 연도에 윤달이 있는지를 반환합니다.
24
- * @param year 1890년 ~ 2049
24
+ * @param year 1890년 ~ 2050
25
25
  * @return 윤달이 있으면 true
26
26
  */
27
27
  export declare const hasLeapMonth: (year: number) => boolean;
28
28
  /**
29
29
  * 해당 월이 윤달인지를 반환합니다.
30
- * @param year 1890년 ~ 2049
30
+ * @param year 1890년 ~ 2050
31
31
  * @param month 1월 ~ 12월
32
32
  * @returns 윤달이면 true
33
33
  */
34
34
  export declare const isLeapMonth: (year: number, month: number) => boolean;
35
35
  /**
36
36
  * 해당 월 (윤달)의 일 수를 반환합니다.
37
- * @param year 1890년 ~ 2049
37
+ * @param year 1890년 ~ 2050
38
38
  * @param month 1월 ~ 12월
39
39
  * @returns 윤달의 일 수 (29 또는 30), 윤달이 아니면 0
40
40
  */
41
41
  export declare const getLeapMonthDays: (year: number, month: number) => number;
42
42
  /**
43
43
  * 해당 연도의 총 일 수를 반환합니다.
44
- * @param year 1890년 ~ 2049
44
+ * @param year 1890년 ~ 2050
45
45
  * @return 해당 연도의 총 일 수
46
46
  */
47
47
  export declare const getYearDays: (year: number) => number;
48
48
  /**
49
49
  * 1890년부터 해당 연도 전까지의 누적 일 수를 반환합니다.
50
- * @param year 1890년 ~ 2049
50
+ * @param year 1890년 ~ 2050
51
51
  * @return 해당 연도 전까지의 누적 일 수
52
52
  */
53
53
  export declare const getTotalDaysBeforeYear: (year: number) => number;
54
54
  /**
55
55
  * 해당 연도 내에서 해당 월 (및 윤달 포함) 전까지의 누적 일 수를 반환합니다.
56
- * @param year 1890년 ~ 2049
56
+ * @param year 1890년 ~ 2050
57
57
  * @param month 1월 ~ 12월
58
58
  * @param isLeapMonth 대상이 윤달이면 true
59
59
  * @returns 해당 연도 내, 해당 월 전까지의 누적 일 수
@@ -61,7 +61,7 @@ export declare const getTotalDaysBeforeYear: (year: number) => number;
61
61
  export declare const getTotalDaysBeforeMonth: (year: number, month: number, isLeapMonth: boolean) => number;
62
62
  /**
63
63
  * 1890년부터 해당 연도, 월, 일 (및 윤달 포함) 까지의 누적 일 수를 반환합니다.
64
- * @param year 1890년 ~ 2049
64
+ * @param year 1890년 ~ 2050
65
65
  * @param month 1월 ~ 12월
66
66
  * @param day 일자
67
67
  * @param isLeapMonth 대상이 윤달이면 true
@@ -83,3 +83,21 @@ export declare const isDateInRange: (year: number, month: number, day: number) =
83
83
  * @returns 유효한 날짜이면 true
84
84
  */
85
85
  export declare const isValidDate: (year: number, month: number, day: number, isLeapMonth: boolean) => boolean;
86
+ /**
87
+ * 해당 월의 0-based 연속적인 월 인덱스를 반환합니다.
88
+ * @param year 1890년 ~ 2050년
89
+ * @param month 1월 ~ 12월
90
+ * @param isLeapMonth 대상이 윤달이면 true
91
+ * @returns 윤달이 있는 해는 0~12 (13개월), 없는 해는 0~11 (12개월)
92
+ */
93
+ export declare const getMonthIndex: (year: number, month: number, isLeapMonth: boolean) => number;
94
+ /**
95
+ * 0-based 연속적인 월 인덱스에 해당하는 월과 윤달 여부를 반환합니다.
96
+ * @param year 1890년 ~ 2050년
97
+ * @param monthIndex 윤달이 있는 해는 0~12 (13개월), 없는 해는 0~11 (12개월)
98
+ * @returns month (1~12)와 isLeapMonth 여부
99
+ */
100
+ export declare const getMonthFromIndex: (year: number, monthIndex: number) => {
101
+ month: number;
102
+ isLeapMonth: boolean;
103
+ };
@@ -3,8 +3,8 @@ export declare const BASE_MONTH = 1;
3
3
  export declare const BASE_DAY = 21;
4
4
  export declare const BASE_VALUE: number;
5
5
  export declare const MAX_YEAR = 2050;
6
- export declare const MAX_MONTH = 1;
7
- export declare const MAX_DAY = 22;
6
+ export declare const MAX_MONTH = 12;
7
+ export declare const MAX_DAY = 31;
8
8
  export declare const MAX_VALUE: number;
9
9
  export declare const isLeapYear: (year: number) => boolean;
10
10
  export declare const getMonthDays: (year: number, month: number) => number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kor-lunar",
3
- "version": "1.3.3",
3
+ "version": "1.5.0",
4
4
  "description": "한국 음력 변환 유틸 / Korean lunar calendar converter",
5
5
  "main": "dist/kor-lunar.js",
6
6
  "module": "dist/kor-lunar.esm.js",