├── .gitignore
├── src
├── test
│ └── java
│ │ └── com
│ │ └── github
│ │ └── usingsky
│ │ └── calendar
│ │ └── KoreanLunarCalendarTest.java
└── main
│ └── java
│ └── com
│ └── github
│ └── usingsky
│ └── calendar
│ └── KoreanLunarCalendar.java
├── LICENSE
├── pom.xml
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | *.class
2 | target/
3 | bin/
4 | .project
5 | .classpath
6 | .settings/
7 | .vscode/
8 |
9 | # Package Files #
10 | *.jar
11 | hs_err_pid*
--------------------------------------------------------------------------------
/src/test/java/com/github/usingsky/calendar/KoreanLunarCalendarTest.java:
--------------------------------------------------------------------------------
1 | package com.github.usingsky.calendar;
2 |
3 | import com.github.usingsky.calendar.KoreanLunarCalendar;
4 |
5 | import static org.junit.Assert.assertEquals;
6 |
7 | import org.junit.Test;
8 |
9 | public class KoreanLunarCalendarTest {
10 |
11 | @Test
12 | public void testSolarToLunar() {
13 | KoreanLunarCalendar calendar = KoreanLunarCalendar.getInstance();
14 | calendar.setSolarDate(2017, 6, 24);
15 |
16 | assertEquals(calendar.getLunarIsoFormat(), "2017-05-01 Intercalation");
17 | assertEquals(calendar.getGapjaString(), "\uC815\uC720\uB144 \uBCD1\uC624\uC6D4 \uC784\uC624\uC77C (\uC724\uC6D4)");
18 | assertEquals(calendar.getChineseGapJaString(), "\u4E01\u9149\u5E74 \u4E19\u5348\u6708 \u58EC\u5348\u65E5 (\u958F\u6708)");
19 | }
20 |
21 | @Test
22 | public void testLunarToSolar() {
23 |
24 | }
25 |
26 |
27 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016 usingsky
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
3 | 4.0.0
4 |
5 | com.github.usingsky
6 | KoreanLunarCalendar
7 | 0.3.1
8 | jar
9 |
10 |
11 | UTF-8
12 | UTF-8
13 |
14 |
15 |
16 |
17 | junit
18 | junit
19 | 4.1
20 | test
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 | org.apache.maven.plugins
29 | maven-compiler-plugin
30 | 3.8.1
31 |
32 | 1.8
33 | 1.8
34 |
35 |
36 |
37 |
38 | org.apache.maven.plugins
39 | maven-source-plugin
40 | 3.2.1
41 |
42 |
43 | attach-sources
44 |
45 | jar
46 |
47 |
48 |
49 |
50 |
51 |
52 | org.apache.maven.plugins
53 | maven-javadoc-plugin
54 | 3.4.1
55 |
56 | 8
57 |
58 |
59 |
60 | attach-javadocs
61 |
62 | jar
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # KoreanLunarCalendar (한국 양음력 변환)
2 | > Library to convert Korean lunar-calendar to Gregorian calendar
3 |
4 | #### Overview
5 | Korean calendar and Chinese calendar is same lunar calendar but have different date.
6 | This follow the KARI(Korea Astronomy and Space Science Institute)
7 | 한국 양음력 변환 (한국천문연구원 기준) - 네트워크 연결 불필요
8 | ```
9 | 음력 지원 범위 (1000년 01월 01일 ~ 2050년 11월 18일)
10 | Korean Lunar Calendar (1000-01-01 ~ 2050-11-18)
11 |
12 | 양력 지원 범위 (1000년 02월 13일 ~ 2050년 12월 31일)
13 | Gregorian Calendar (1000-02-13 ~ 2050-12-31)
14 | ```
15 | [Example Site](https://usingsky.github.io/korean_lunar_calendar_js)
16 |
17 | ## Docs
18 |
19 | - [Repo](#repo)
20 | - [Import](#import)
21 | - [Example](#example)
22 | - [Validation](#validation)
23 | - [Other languages](#other-languages)
24 |
25 | ## Repo
26 |
27 | Maven
28 |
29 | ```xml
30 |
31 | ...
32 |
33 | jitpack.io
34 | https://jitpack.io
35 |
36 |
37 | ```
38 |
39 | ```xml
40 |
41 | com.github.usingsky
42 | KoreanLunarCalendar
43 | 0.3.1
44 |
45 | ```
46 |
47 | Gradle
48 |
49 | ```groovy
50 | repositories {
51 | ...
52 | maven { url 'https://jitpack.io' }
53 | }
54 | ```
55 |
56 | ```groovy
57 | dependencies {
58 | ...
59 | compile 'com.github.usingsky:KoreanLunarCalendar:0.3.1'
60 | ...
61 | }
62 | ```
63 | ## Import
64 |
65 | ```java
66 | import com.github.usingsky.calendar.KoreanLunarCalendar
67 | ```
68 |
69 | ## Example
70 |
71 | Korean Solar Date -> Korean Lunar Date (양력 -> 음력)
72 |
73 | ```java
74 | KoreanLunarCalendar calendar = KoreanLunarCalendar.getInstance();
75 |
76 | // param : year(년), month(월), day(일)
77 | calendar.setSolarDate(2017, 6, 24);
78 |
79 | // Lunar Date (ISO format)
80 | System.out.println(calendar.getLunarIsoFormat());
81 | // Korean GapJa String
82 | System.out.println(calendar.getGapjaString());
83 | // Chinese GapJa String
84 | System.out.println(calendar.getChineseGapJaString());
85 | ```
86 |
87 | Result
88 |
89 | ```java
90 | 2017-05-01 Intercalation
91 | 정유년 병오월 임오일 (윤월)
92 | 丁酉年 丙午月 壬午日 (閏月)
93 | ```
94 |
95 | Korean Lunar Date -> Korean Solar Date (음력 -> 양력)
96 |
97 | ```java
98 | // param : year(년), month(월), day(일), intercalation(윤달여부)
99 | calendar.setLunarDate(1956, 1, 21, false);
100 |
101 | // Solar Date (ISO format)
102 | System.out.println(calendar.getSolarIsoFormat());
103 | // Korean GapJa String
104 | System.out.println(calendar.getGapjaString());
105 | // Chinese GapJa String
106 | System.out.println(calendar.getChineseGapJaString());
107 | ```
108 |
109 | Result
110 |
111 | ```java
112 | 1956-03-03
113 | 병신년 경인월 기사일
114 | 丙申年 庚寅月 己巳日
115 | ```
116 |
117 | ## Validation
118 |
119 | Check for invalid date input
120 |
121 | ```java
122 | KoreanLunarCalendar calendar = KoreanLunarCalendar.getInstance();
123 |
124 | // Invalid date
125 | calendar.setLunarDate(99, 1, 1, false); // => return false
126 | calendar.setSolarDate(2051, 1, 1); // => return false
127 |
128 | // OK
129 | calendar.setLunarDate(1000, 1, 1, false); // => return true
130 | calendar.setSolarDate(2050, 12, 31); // => return true
131 | ```
132 |
133 | ## Other languages
134 |
135 | - Java : [https://github.com/usingsky/KoreanLunarCalendar](https://github.com/usingsky/KoreanLunarCalendar)
136 | - Python : [https://github.com/usingsky/korean_lunar_calendar_py](https://github.com/usingsky/korean_lunar_calendar_py)
137 | - Javascript : [https://github.com/usingsky/korean_lunar_calendar_js](https://github.com/usingsky/korean_lunar_calendar_js)
138 |
--------------------------------------------------------------------------------
/src/main/java/com/github/usingsky/calendar/KoreanLunarCalendar.java:
--------------------------------------------------------------------------------
1 | /**
2 | * The MIT License (MIT)
3 | *
4 | * Copyright (c) 2018 usingsky(usingsky@gmail.com)
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in all
14 | * copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | * SOFTWARE.
23 | */
24 |
25 | package com.github.usingsky.calendar;
26 |
27 | public class KoreanLunarCalendar {
28 |
29 | private int lunarYear = 0;
30 | private int lunarMonth = 0;
31 | private int lunarDay = 0;
32 | private boolean isIntercalation = false;
33 |
34 | private int solarYear = 0;
35 | private int solarMonth = 0;
36 | private int solarDay = 0;
37 |
38 | private int[] gapjaYearInx = { 0, 0, 0 };
39 | private int[] gapjaMonthInx = { 0, 0, 1 };
40 | private int[] gapjaDayInx = { 0, 0, 2 };
41 |
42 | private static int KOREAN_LUNAR_MIN_VALUE = 10000101;
43 | private static int KOREAN_LUNAR_MAX_VALUE = 20501118;
44 | private static int KOREAN_SOLAR_MIN_VALUE = 10000213;
45 | private static int KOREAN_SOLAR_MAX_VALUE = 20501231;
46 |
47 | private static int KOREAN_LUNAR_BASE_YEAR = 1000;
48 | private static int SOLAR_LUNAR_DAY_DIFF = 43;
49 |
50 | private static int LUNAR_SMALL_MONTH_DAY = 29;
51 | private static int LUNAR_BIG_MONTH_DAY = 30;
52 | private static int SOLAR_SMALL_YEAR_DAY = 365;
53 | private static int SOLAR_BIG_YEAR_DAY = 366;
54 |
55 | private static int[] SOLAR_DAYS = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 29 };
56 | private static char[] KOREAN_CHEONGAN = { 0xac11, 0xc744, 0xbcd1, 0xc815, 0xbb34, 0xae30, 0xacbd, 0xc2e0, 0xc784, 0xacc4 };
57 | private static char[] KOREAN_GANJI = { 0xc790, 0xcd95, 0xc778, 0xbb18, 0xc9c4, 0xc0ac, 0xc624, 0xbbf8, 0xc2e0, 0xc720, 0xc220, 0xd574 };
58 | private static char[] KOREAN_GAPJA_UNIT = { 0xb144, 0xc6d4, 0xc77c };
59 |
60 | private static char[] CHINESE_CHEONGAN = { 0x7532, 0x4e59, 0x4e19, 0x4e01, 0x620a, 0x5df1, 0x5e9a, 0x8f9b, 0x58ec, 0x7678 };
61 | private static char[] CHINESE_GANJI = { 0x5b50, 0x4e11, 0x5bc5, 0x536f, 0x8fb0, 0x5df3, 0x5348, 0x672a, 0x7533, 0x9149, 0x620c, 0x4ea5 };
62 | private static char[] CHINESE_GAPJA_UNIT = { 0x5e74, 0x6708, 0x65e5 };
63 |
64 | private static char[] INTERCALATION_STR = { 0xc724, 0x958f };
65 |
66 | // 1000 ~ 2050
67 | private static int[] KOREAN_LUNAR_DATA = {
68 | 0x82c60a57, 0x82fec52b, 0x82c40d2a, 0x82c60d55, 0xc30095ad, 0x82c4056a, 0x82c6096d, 0x830054dd, 0xc2c404ad, 0x82c40a4d,
69 | 0x83002e4d, 0x82c40b26, 0xc300ab56, 0x82c60ad5, 0x82c4035a, 0x8300697a, 0xc2c6095b, 0x82c4049b, 0x83004a9b, 0x82c40a4b,
70 | 0xc301caa5, 0x82c406aa, 0x82c60ad5, 0x830092dd, 0xc2c402b5, 0x82c60957, 0x82fe54ae, 0x82c60c97, 0xc2c4064b, 0x82ff254a,
71 | 0x82c60da9, 0x8300a6b6, 0xc2c6066d, 0x82c4026e, 0x8301692e, 0x82c4092e, 0xc2c40c96, 0x83004d95, 0x82c40d4a, 0x8300cd69,
72 | 0xc2c40b58, 0x82c80d6b, 0x8301926b, 0x82c4025d, 0xc2c4092b, 0x83005aab, 0x82c40a95, 0x82c40b4a, 0xc3021eab, 0x82c402d5,
73 | 0x8301b55a, 0x82c604bb, 0xc2c4025b, 0x83007537, 0x82c4052b, 0x82c40695, 0xc3003755, 0x82c406aa, 0x8303cab5, 0x82c40275,
74 | 0xc2c404b6, 0x83008a5e, 0x82c40a56, 0x82c40d26, 0xc3005ea6, 0x82c60d55, 0x82c405aa, 0x83001d6a, 0xc2c6096d, 0x8300b4af,
75 | 0x82c4049d, 0x82c40a4d, 0xc3007d2d, 0x82c40aa6, 0x82c60b55, 0x830045d5, 0xc2c4035a, 0x82c6095d, 0x83011173, 0x82c4045b,
76 | 0xc3009a4f, 0x82c4064b, 0x82c40aa5, 0x83006b69, 0xc2c606b5, 0x82c402da, 0x83002ab6, 0x82c60937, 0xc2fec497, 0x82c60c97,
77 | 0x82c4064b, 0x82fe86aa, 0xc2c60da5, 0x82c405b4, 0x83034a6d, 0x82c402ae, 0xc2c40e61, 0x83002d2e, 0x82c40c96, 0x83009d4d,
78 | 0x82c40d4a, 0x82c60d65, 0x83016595, 0x82c6055d, 0xc2c4026d, 0x83002a5d, 0x82c4092b, 0x8300aa97, 0xc2c40a95, 0x82c40b4a,
79 | 0x83008b5a, 0x82c60ad5, 0xc2c6055b, 0x830042b7, 0x82c40457, 0x82c4052b, 0xc3001d2b, 0x82c40695, 0x8300972d, 0x82c405aa,
80 | 0xc2c60ab5, 0x830054ed, 0x82c404b6, 0x82c60a57, 0xc2ff344e, 0x82c40d26, 0x8301be92, 0x82c60d55, 0xc2c405aa, 0x830089ba,
81 | 0x82c6096d, 0x82c404ae, 0xc3004a9d, 0x82c40a4d, 0x82c40d25, 0x83002f25, 0xc2c40b54, 0x8303ad69, 0x82c402da, 0x82c6095d,
82 | 0xc301649b, 0x82c4049b, 0x82c40a4b, 0x83004b4b, 0xc2c406a5, 0x8300bb53, 0x82c406b4, 0x82c60ab6, 0xc3018956, 0x82c60997,
83 | 0x82c40497, 0x83004697, 0xc2c4054b, 0x82fec6a5, 0x82c60da5, 0x82c405ac, 0xc303aab5, 0x82c4026e, 0x82c4092e, 0x83006cae,
84 | 0xc2c40c96, 0x82c40d4a, 0x83002f4a, 0x82c60d55, 0xc300b56b, 0x82c6055b, 0x82c4025d, 0x8300793d, 0xc2c40927, 0x82c40a95,
85 | 0x83015d15, 0x82c40b4a, 0xc2c60b55, 0x830112d5, 0x82c604db, 0x82fe925e, 0xc2c60a57, 0x82c4052b, 0x83006aab, 0x82c40695,
86 | 0xc2c406aa, 0x83003baa, 0x82c60ab5, 0x8300b4b7, 0xc2c404ae, 0x82c60a57, 0x82fe752e, 0x82c40d26, 0xc2c60e93, 0x830056d5,
87 | 0x82c405aa, 0x82c609b5, 0xc300256d, 0x82c404ae, 0x8301aa4d, 0x82c40a4d, 0xc2c40d26, 0x83006d65, 0x82c40b52, 0x82c60d6a,
88 | 0xc30026da, 0x82c6095d, 0x8301c49d, 0x82c4049b, 0xc2c40a4b, 0x83008aab, 0x82c406a5, 0x82c40b54, 0xc3004bb4, 0x82c60ab6,
89 | 0x82c6095b, 0x83002537, 0xc2c40497, 0x8300964f, 0x82c4054b, 0x82c406a5, 0xc30176c5, 0x82c405ac, 0x82c60ab6, 0x8301386e,
90 | 0xc2c4092e, 0x8300cc97, 0x82c40c96, 0x82c40d4a, 0xc3008daa, 0x82c60b55, 0x82c4056a, 0x83025adb, 0xc2c4025d, 0x82c4092e,
91 | 0x83002d2b, 0x82c40a95, 0xc3009d4d, 0x82c40b2a, 0x82c60b55, 0x83007575, 0xc2c404da, 0x82c60a5b, 0x83004557, 0x82c4052b,
92 | 0xc301ca93, 0x82c40693, 0x82c406aa, 0x83008ada, 0xc2c60ae5, 0x82c404b6, 0x83004aae, 0x82c60a57, 0xc2c40527, 0x82ff2526,
93 | 0x82c60e53, 0x8300a6cb, 0xc2c405aa, 0x82c605ad, 0x830164ad, 0x82c404ae, 0xc2c40a4e, 0x83004d4d, 0x82c40d26, 0x8300bd53,
94 | 0xc2c40b52, 0x82c60b6a, 0x8301956a, 0x82c60557, 0xc2c4049d, 0x83015a1b, 0x82c40a4b, 0x82c40aa5, 0xc3001ea5, 0x82c40b52,
95 | 0x8300bb5a, 0x82c60ab6, 0xc2c6095b, 0x830064b7, 0x82c40497, 0x82c4064b, 0xc300374b, 0x82c406a5, 0x8300b6b3, 0x82c405ac,
96 | 0xc2c60ab6, 0x830182ad, 0x82c4049e, 0x82c40a4d, 0xc3005d4b, 0x82c40b25, 0x82c40b52, 0x83012e52, 0xc2c60b5a, 0x8300a95e,
97 | 0x82c6095b, 0x82c4049b, 0xc3006a57, 0x82c40a4b, 0x82c40aa5, 0x83004ba5, 0xc2c406d4, 0x8300cad6, 0x82c60ab6, 0x82c60937,
98 | 0x8300849f, 0x82c40497, 0x82c4064b, 0x82fe56ca, 0xc2c60da5, 0x82c405aa, 0x83001d6c, 0x82c60a6e, 0xc300b92f, 0x82c4092e,
99 | 0x82c40c96, 0x83007d55, 0xc2c40d4a, 0x82c60d55, 0x83013555, 0x82c4056a, 0xc2c60a6d, 0x83001a5d, 0x82c4092b, 0x83008a5b,
100 | 0xc2c40a95, 0x82c40b2a, 0x83015b2a, 0x82c60ad5, 0xc2c404da, 0x83001cba, 0x82c60a57, 0x8300952f, 0xc2c40527, 0x82c40693,
101 | 0x830076b3, 0x82c406aa, 0xc2c60ab5, 0x83003575, 0x82c404b6, 0x8300ca67, 0xc2c40a2e, 0x82c40d16, 0x83008e96, 0x82c40d4a,
102 | 0xc2c60daa, 0x830055ea, 0x82c6056d, 0x82c404ae, 0xc301285d, 0x82c40a2d, 0x8300ad17, 0x82c40aa5, 0xc2c40b52, 0x83007d74,
103 | 0x82c60ada, 0x82c6055d, 0xc300353b, 0x82c4045b, 0x82c40a2b, 0x83011a2b, 0xc2c40aa5, 0x83009b55, 0x82c406b2, 0x82c60ad6,
104 | 0xc3015536, 0x82c60937, 0x82c40457, 0x83003a57, 0xc2c4052b, 0x82feaaa6, 0x82c60d95, 0x82c405aa, 0xc3017aac, 0x82c60a6e,
105 | 0x82c4052e, 0x83003cae, 0xc2c40a56, 0x8300bd2b, 0x82c40d2a, 0x82c60d55, 0xc30095ad, 0x82c4056a, 0x82c60a6d, 0x8300555d,
106 | 0xc2c4052b, 0x82c40a8d, 0x83002e55, 0x82c40b2a, 0xc300ab56, 0x82c60ad5, 0x82c404da, 0x83006a7a, 0xc2c60a57, 0x82c4051b,
107 | 0x83014a17, 0x82c40653, 0xc301c6a9, 0x82c405aa, 0x82c60ab5, 0x830092bd, 0xc2c402b6, 0x82c60a37, 0x82fe552e, 0x82c40d16,
108 | 0x82c60e4b, 0x82fe3752, 0x82c60daa, 0x8301b5b4, 0xc2c6056d, 0x82c402ae, 0x83007a3d, 0x82c40a2d, 0xc2c40d15, 0x83004d95,
109 | 0x82c40b52, 0x8300cb69, 0xc2c60ada, 0x82c6055d, 0x8301925b, 0x82c4045b, 0xc2c40a2b, 0x83005aab, 0x82c40a95, 0x82c40b52,
110 | 0xc3001eaa, 0x82c60ab6, 0x8300c55b, 0x82c604b7, 0xc2c40457, 0x83007537, 0x82c4052b, 0x82c40695, 0xc3014695, 0x82c405aa,
111 | 0x8300cab5, 0x82c60a6e, 0xc2c404ae, 0x83008a5e, 0x82c40a56, 0x82c40d2a, 0xc3006eaa, 0x82c60d55, 0x82c4056a, 0x8301295a,
112 | 0xc2c6095d, 0x8300b4af, 0x82c4049b, 0x82c40a4d, 0xc3007d2d, 0x82c40b2a, 0x82c60b55, 0x830045d5, 0xc2c402da, 0x82c6095b,
113 | 0x83011157, 0x82c4049b, 0xc3009a4f, 0x82c4064b, 0x82c406a9, 0x83006aea, 0xc2c606b5, 0x82c402b6, 0x83002aae, 0x82c60937,
114 | 0xc2ffb496, 0x82c40c96, 0x82c60e4b, 0x82fe76b2, 0xc2c60daa, 0x82c605ad, 0x8300336d, 0x82c4026e, 0xc2c4092e, 0x83002d2d,
115 | 0x82c40c95, 0x83009d4d, 0xc2c40b4a, 0x82c60b69, 0x8301655a, 0x82c6055b, 0xc2c4025d, 0x83002a5b, 0x82c4092b, 0x8300aa97,
116 | 0xc2c40695, 0x82c4074a, 0x83008b5a, 0x82c60ab6, 0xc2c6053b, 0x830042b7, 0x82c40257, 0x82c4052b, 0xc3001d2b, 0x82c40695,
117 | 0x830096ad, 0x82c405aa, 0xc2c60ab5, 0x830054ed, 0x82c404ae, 0x82c60a57, 0xc2ff344e, 0x82c40d2a, 0x8301bd94, 0x82c60b55,
118 | 0x82c4056a, 0x8300797a, 0x82c6095d, 0x82c404ae, 0xc3004a9b, 0x82c40a4d, 0x82c40d25, 0x83011aaa, 0xc2c60b55, 0x8300956d,
119 | 0x82c402da, 0x82c6095b, 0xc30054b7, 0x82c40497, 0x82c40a4b, 0x83004b4b, 0xc2c406a9, 0x8300cad5, 0x82c605b5, 0x82c402b6,
120 | 0xc300895e, 0x82c6092f, 0x82c40497, 0x82fe4696, 0xc2c40d4a, 0x8300cea5, 0x82c60d69, 0x82c6056d, 0xc301a2b5, 0x82c4026e,
121 | 0x82c4092e, 0x83006cad, 0xc2c40c95, 0x82c40d4a, 0x83002f4a, 0x82c60b59, 0xc300c56d, 0x82c6055b, 0x82c4025d, 0x8300793b,
122 | 0xc2c4092b, 0x82c40a95, 0x83015b15, 0x82c406ca, 0xc2c60ad5, 0x830112b6, 0x82c604bb, 0x8300925f, 0xc2c40257, 0x82c4052b,
123 | 0x82fe6aaa, 0x82c60e95, 0xc2c406aa, 0x83003baa, 0x82c60ab5, 0x8300b4b7, 0xc2c404ae, 0x82c60a57, 0x82fe752d, 0x82c40d26,
124 | 0xc2c60d95, 0x830055d5, 0x82c4056a, 0x82c6096d, 0xc300255d, 0x82c404ae, 0x8300aa4f, 0x82c40a4d, 0xc2c40d25, 0x83006d69,
125 | 0x82c60b55, 0x82c4035a, 0xc3002aba, 0x82c6095b, 0x8301c49b, 0x82c40497, 0xc2c40a4b, 0x83008b2b, 0x82c406a5, 0x82c406d4,
126 | 0xc3034ab5, 0x82c402b6, 0x82c60937, 0x8300252f, 0xc2c40497, 0x82fe964e, 0x82c40d4a, 0x82c60ea5, 0xc30166a9, 0x82c6056d,
127 | 0x82c402b6, 0x8301385e, 0xc2c4092e, 0x8300bc97, 0x82c40a95, 0x82c40d4a, 0xc3008daa, 0x82c60b4d, 0x82c6056b, 0x830042db,
128 | 0xc2c4025d, 0x82c4092d, 0x83002d2b, 0x82c40a95, 0xc3009b4d, 0x82c406aa, 0x82c60ad5, 0x83006575, 0xc2c604bb, 0x82c4025b,
129 | 0x83013457, 0x82c4052b, 0xc2ffba94, 0x82c60e95, 0x82c406aa, 0x83008ada, 0xc2c609b5, 0x82c404b6, 0x83004aae, 0x82c60a4f,
130 | 0xc2c20526, 0x83012d26, 0x82c60d55, 0x8301a5a9, 0xc2c4056a, 0x82c6096d, 0x8301649d, 0x82c4049e, 0xc2c40a4d, 0x83004d4d,
131 | 0x82c40d25, 0x8300bd53, 0xc2c40b54, 0x82c60b5a, 0x8301895a, 0x82c6095b, 0xc2c4049b, 0x83004a97, 0x82c40a4b, 0x82c40aa5,
132 | 0xc3001ea5, 0x82c406d4, 0x8302badb, 0x82c402b6, 0xc2c60937, 0x830064af, 0x82c40497, 0x82c4064b, 0xc2fe374a, 0x82c60da5,
133 | 0x8300b6b5, 0x82c6056d, 0xc2c402ae, 0x8300793e, 0x82c4092e, 0x82c40c96, 0xc3015d15, 0x82c40d4a, 0x82c60da5, 0x83013555,
134 | 0xc2c4056a, 0x83007a7a, 0x82c60a5d, 0x82c4092d, 0xc3006aab, 0x82c40a95, 0x82c40b4a, 0x83004baa, 0xc2c60ad5, 0x82c4055a,
135 | 0x830128ba, 0x82c60a5b, 0xc3007537, 0x82c4052b, 0x82c40693, 0x83015715, 0xc2c406aa, 0x82c60ad5, 0x830035b5, 0x82c404b6,
136 | 0xc3008a5e, 0x82c40a4e, 0x82c40d26, 0x83006ea6, 0xc2c40d52, 0x82c60daa, 0x8301466a, 0x82c6056d, 0xc2c404ae, 0x83003a9d,
137 | 0x82c40a4d, 0x83007d2b, 0xc2c40b25, 0x82c40d52, 0x83015d54, 0x82c60b5a, 0xc2c6055d, 0x8300355b, 0x82c4049b, 0x83007657,
138 | 0x82c40a4b, 0x82c40aa5, 0x83006b65, 0x82c406d2, 0xc2c60ada, 0x830045b6, 0x82c60937, 0x82c40497, 0xc3003697, 0x82c4064d,
139 | 0x82fe76aa, 0x82c60da5, 0xc2c405aa, 0x83005aec, 0x82c60aae, 0x82c4092e, 0xc3003d2e, 0x82c40c96, 0x83018d45, 0x82c40d4a,
140 | 0xc2c60d55, 0x83016595, 0x82c4056a, 0x82c60a6d, 0xc300455d, 0x82c4052d, 0x82c40a95, 0x83013c95, 0xc2c40b4a, 0x83017b4a,
141 | 0x82c60ad5, 0x82c4055a, 0xc3015a3a, 0x82c60a5b, 0x82c4052b, 0x83014a17, 0xc2c40693, 0x830096ab, 0x82c406aa, 0x82c60ab5,
142 | 0xc30064f5, 0x82c404b6, 0x82c60a57, 0x82fe452e, 0xc2c40d16, 0x82c60e93, 0x82fe3752, 0x82c60daa, 0xc30175aa, 0x82c6056d,
143 | 0x82c404ae, 0x83015a1d, 0xc2c40a2d, 0x82c40d15, 0x83004da5, 0x82c40b52, 0xc3009d6a, 0x82c60ada, 0x82c6055d, 0x8301629b,
144 | 0xc2c4045b, 0x82c40a2b, 0x83005b2b, 0x82c40a95, 0xc2c40b52, 0x83012ab2, 0x82c60ad6, 0x83017556, 0xc2c60537, 0x82c40457,
145 | 0x83005657, 0x82c4052b, 0xc2c40695, 0x83003795, 0x82c405aa, 0x8300aab6, 0xc2c60a6d, 0x82c404ae, 0x83006a6e, 0x82c40a56,
146 | 0xc2c40d2a, 0x83005eaa, 0x82c60d55, 0x82c405aa, 0xc3003b6a, 0x82c60a6d, 0x830074bd, 0x82c404ab, 0xc2c40a8d, 0x83005d55,
147 | 0x82c40b2a, 0x82c60b55, 0xc30045d5, 0x82c404da, 0x82c6095d, 0x83002557, 0xc2c4049b, 0x83006a97, 0x82c4064b, 0x82c406a9,
148 | 0x83004baa, 0x82c606b5, 0x82c402ba, 0x83002ab6, 0xc2c60937, 0x82fe652e, 0x82c40d16, 0x82c60e4b, 0xc2fe56d2, 0x82c60da9,
149 | 0x82c605b5, 0x8300336d, 0xc2c402ae, 0x82c40a2e, 0x83002e2d, 0x82c40c95, 0xc3006d55, 0x82c40b52, 0x82c60b69, 0x830045da,
150 | 0xc2c6055d, 0x82c4025d, 0x83003a5b, 0x82c40a2b, 0xc3017a8b, 0x82c40a95, 0x82c40b4a, 0x83015b2a, 0xc2c60ad5, 0x82c6055b,
151 | 0x830042b7, 0x82c40257, 0xc300952f, 0x82c4052b, 0x82c40695, 0x830066d5, 0xc2c405aa, 0x82c60ab5, 0x8300456d, 0x82c404ae,
152 | 0xc2c60a57, 0x82ff3456, 0x82c40d2a, 0x83017e8a, 0xc2c60d55, 0x82c405aa, 0x83005ada, 0x82c6095d, 0xc2c404ae, 0x83004aab,
153 | 0x82c40a4d, 0x83008d2b, 0xc2c40b29, 0x82c60b55, 0x83007575, 0x82c402da, 0xc2c6095d, 0x830054d7, 0x82c4049b, 0x82c40a4b,
154 | 0xc3013a4b, 0x82c406a9, 0x83008ad9, 0x82c606b5, 0xc2c402b6, 0x83015936, 0x82c60937, 0x82c40497, 0xc2fe4696, 0x82c40e4a,
155 | 0x8300aea6, 0x82c60da9, 0xc2c605ad, 0x830162ad, 0x82c402ae, 0x82c4092e, 0xc3005cad, 0x82c40c95, 0x82c40d4a, 0x83013d4a,
156 | 0xc2c60b69, 0x8300757a, 0x82c6055b, 0x82c4025d, 0xc300595b, 0x82c4092b, 0x82c40a95, 0x83004d95, 0xc2c40b4a, 0x82c60b55,
157 | 0x830026d5, 0x82c6055b, 0xc3006277, 0x82c40257, 0x82c4052b, 0x82fe5aaa, 0xc2c60e95, 0x82c406aa, 0x83003baa, 0x82c60ab5,
158 | 0x830084bd, 0x82c404ae, 0x82c60a57, 0x82fe554d, 0xc2c40d26, 0x82c60d95, 0x83014655, 0x82c4056a, 0xc2c609ad, 0x8300255d,
159 | 0x82c404ae, 0x83006a5b, 0xc2c40a4d, 0x82c40d25, 0x83005da9, 0x82c60b55, 0xc2c4056a, 0x83002ada, 0x82c6095d, 0x830074bb,
160 | 0xc2c4049b, 0x82c40a4b, 0x83005b4b, 0x82c406a9, 0xc2c40ad4, 0x83024bb5, 0x82c402b6, 0x82c6095b, 0xc3002537, 0x82c40497,
161 | 0x82fe6656, 0x82c40e4a, 0xc2c60ea5, 0x830156a9, 0x82c605b5, 0x82c402b6, 0xc30138ae, 0x82c4092e, 0x83017c8d, 0x82c40c95,
162 | 0xc2c40d4a, 0x83016d8a, 0x82c60b69, 0x82c6056d, 0xc301425b, 0x82c4025d, 0x82c4092d, 0x83002d2b, 0xc2c40a95, 0x83007d55,
163 | 0x82c40b4a, 0x82c60b55, 0xc3015555, 0x82c604db, 0x82c4025b, 0x83013857, 0xc2c4052b, 0x83008a9b, 0x82c40695, 0x82c406aa,
164 | 0xc3006aea, 0x82c60ab5, 0x82c404b6, 0x83004aae, 0xc2c60a57, 0x82c40527, 0x82fe3726, 0x82c60d95, 0xc30076b5, 0x82c4056a,
165 | 0x82c609ad, 0x830054dd, 0xc2c404ae, 0x82c40a4e, 0x83004d4d, 0x82c40d25, 0xc3008d59, 0x82c40b54, 0x82c60d6a, 0x8301695a,
166 | 0xc2c6095b, 0x82c4049b, 0x83004a9b, 0x82c40a4b, 0xc300ab27, 0x82c406a5, 0x82c406d4, 0x83026b75, 0xc2c402b6, 0x82c6095b,
167 | 0x830054b7, 0x82c40497, 0xc2c4064b, 0x82fe374a, 0x82c60ea5, 0x830086d9, 0xc2c605ad, 0x82c402b6, 0x8300596e, 0x82c4092e,
168 | 0xc2c40c96, 0x83004e95, 0x82c40d4a, 0x82c60da5, 0xc3002755, 0x82c4056c, 0x83027abb, 0x82c4025d, 0xc2c4092d, 0x83005cab,
169 | 0x82c40a95, 0x82c40b4a, 0xc3013b4a, 0x82c60b55, 0x8300955d, 0x82c404ba, 0xc2c60a5b, 0x83005557, 0x82c4052b, 0x82c40a95,
170 | 0xc3004b95, 0x82c406aa, 0x82c60ad5, 0x830026b5, 0xc2c404b6, 0x83006a6e, 0x82c60a57, 0x82c40527, 0xc2fe56a6, 0x82c60d93,
171 | 0x82c405aa, 0x83003b6a, 0xc2c6096d, 0x8300b4af, 0x82c404ae, 0x82c40a4d, 0xc3016d0d, 0x82c40d25, 0x82c40d52, 0x83005dd4,
172 | 0xc2c60b6a, 0x82c6096d, 0x8300255b, 0x82c4049b, 0xc3007a57, 0x82c40a4b, 0x82c40b25, 0x83015b25, 0xc2c406d4, 0x82c60ada,
173 | 0x830138b6,};
174 |
175 | private KoreanLunarCalendar() {
176 | }
177 |
178 | /**
179 | * Constructs a KoreanLunarCalendar instance.
180 | */
181 | public static KoreanLunarCalendar getInstance() {
182 | return LazyHolder.INSTANCE;
183 | }
184 |
185 | private static class LazyHolder {
186 | private static final KoreanLunarCalendar INSTANCE = new KoreanLunarCalendar();
187 | }
188 |
189 | private int getLunarData(int year) {
190 | return KOREAN_LUNAR_DATA[year - KOREAN_LUNAR_BASE_YEAR];
191 | }
192 |
193 | private int getLunarIntercalationMonth(int lunarData) {
194 | return (lunarData >> 12) & 0x000F;
195 | }
196 |
197 | private int getLunarDays(int year) {
198 | int lunarData = getLunarData(year);
199 | return (lunarData >> 17) & 0x01FF;
200 | }
201 |
202 | private int getLunarDays(int year, int month, boolean isIntercalation) {
203 | int days = 0;
204 | int lunarData = getLunarData(year);
205 | if (isIntercalation && getLunarIntercalationMonth(lunarData) == month) {
206 | days = ((lunarData >> 16) & 0x01) > 0 ? LUNAR_BIG_MONTH_DAY : LUNAR_SMALL_MONTH_DAY;
207 | } else {
208 | days = ((lunarData >> (12 - month)) & 0x01) > 0 ? LUNAR_BIG_MONTH_DAY : LUNAR_SMALL_MONTH_DAY;
209 | }
210 | return days;
211 | }
212 |
213 | private int getLunarDaysBeforeBaseYear(int year) {
214 | int days = 0;
215 | for (int baseYear = KOREAN_LUNAR_BASE_YEAR; baseYear < year + 1; baseYear++) {
216 | days += getLunarDays(baseYear);
217 | }
218 | return days;
219 | }
220 |
221 | private int getLunarDaysBeforeBaseMonth(int year, int month, boolean isIntercalation) {
222 | int days = 0;
223 | if (year >= KOREAN_LUNAR_BASE_YEAR && month > 0) {
224 | for (int baseMonth = 1; baseMonth < month + 1; baseMonth++) {
225 | days += getLunarDays(year, baseMonth, false);
226 | }
227 |
228 | if (isIntercalation) {
229 | int intercalationMonth = getLunarIntercalationMonth(getLunarData(year));
230 | if (intercalationMonth > 0 && intercalationMonth < month + 1) {
231 | days += getLunarDays(year, intercalationMonth, true);
232 | }
233 | }
234 | }
235 | return days;
236 | }
237 |
238 | private int getLunarAbsDays(int year, int month, int day, boolean isIntercalation) {
239 | int days = 0;
240 | days = getLunarDaysBeforeBaseYear(year - 1) + getLunarDaysBeforeBaseMonth(year, month - 1, true) + day;
241 |
242 | if (isIntercalation && getLunarIntercalationMonth(getLunarData(year)) == month) {
243 | days += getLunarDays(year, month, false);
244 | }
245 | return days;
246 | }
247 |
248 | private boolean isSolarIntercalationYear(int lunarData) {
249 | return ((lunarData >> 30) & 0x01) > 0;
250 | }
251 |
252 | private int getSolarDays(int year) {
253 | int days = 0;
254 | int lunarData = getLunarData(year);
255 | days = isSolarIntercalationYear(lunarData) ? SOLAR_BIG_YEAR_DAY : SOLAR_SMALL_YEAR_DAY;
256 | /*
257 | * if(year == 1582){ days -= 10; }
258 | */
259 | return days;
260 | }
261 |
262 | private int getSolarDays(int year, int month) {
263 | int days = 0;
264 | int lunarData = getLunarData(year);
265 | if (month == 2 && isSolarIntercalationYear(lunarData)) {
266 | days = SOLAR_DAYS[12];
267 | } else {
268 | days = SOLAR_DAYS[month - 1];
269 | }
270 | return days;
271 | }
272 |
273 | private int getSolarDayBeforeBaseYear(int year) {
274 | int days = 0;
275 | for (int baseYear = KOREAN_LUNAR_BASE_YEAR; baseYear < year + 1; baseYear++) {
276 | days += getSolarDays(baseYear);
277 | }
278 | return days;
279 | }
280 |
281 | private int getSolarDaysBeforeBaseMonth(int year, int month) {
282 | int days = 0;
283 | for (int baseMonth = 1; baseMonth < month + 1; baseMonth++) {
284 | days += getSolarDays(year, baseMonth);
285 | }
286 | return days;
287 | }
288 |
289 | private int getSolarAbsDays(int year, int month, int day) {
290 | int days = 0;
291 | days = getSolarDayBeforeBaseYear(year - 1) + getSolarDaysBeforeBaseMonth(year, month - 1) + day;
292 | days -= SOLAR_LUNAR_DAY_DIFF;
293 | return days;
294 | }
295 |
296 | private void setSolarDateByLunarDate(int lunarYear, int lunarMonth, int lunarDay, boolean isIntercalation) {
297 | int absDays = getLunarAbsDays(lunarYear, lunarMonth, lunarDay, isIntercalation);
298 | int solarYear = 0;
299 | int solarMonth = 0;
300 | int solarDay = 0;
301 |
302 | solarYear = (absDays < getSolarAbsDays(lunarYear + 1, 1, 1)) ? lunarYear : lunarYear + 1;
303 |
304 | for (int month = 12; month > 0; month--) {
305 | int absDaysByMonth = getSolarAbsDays(solarYear, month, 1);
306 | if (absDays >= absDaysByMonth) {
307 | solarMonth = month;
308 | solarDay = absDays - absDaysByMonth + 1;
309 | break;
310 | }
311 | }
312 |
313 | setSolarYear(solarYear);
314 | setSolarMonth(solarMonth);
315 | setSolarDay(solarDay);
316 | }
317 |
318 | private void setLunarDateBySolarDate(int solarYear, int solarMonth, int solarDay) {
319 | int absDays = getSolarAbsDays(solarYear, solarMonth, solarDay);
320 | int lunarYear = 0;
321 | int lunarMonth = 0;
322 | int lunarDay = 0;
323 | boolean isIntercalation = false;
324 |
325 | lunarYear = (absDays >= getLunarAbsDays(solarYear, 1, 1, false)) ? solarYear : solarYear - 1;
326 |
327 | for (int month = 12; month > 0; month--) {
328 | int absDaysByMonth = getLunarAbsDays(lunarYear, month, 1, false);
329 | if (absDays >= absDaysByMonth) {
330 | lunarMonth = month;
331 |
332 | if (getLunarIntercalationMonth(getLunarData(lunarYear)) == month) {
333 | isIntercalation = absDays >= getLunarAbsDays(lunarYear, month, 1, true);
334 | }
335 |
336 | lunarDay = absDays - getLunarAbsDays(lunarYear, lunarMonth, 1, isIntercalation) + 1;
337 | break;
338 | }
339 | }
340 |
341 | setLunarYear(lunarYear);
342 | setLunarMonth(lunarMonth);
343 | setLunarDay(lunarDay);
344 | setIntercalation(isIntercalation);
345 | }
346 |
347 | private boolean checkValidDate(boolean isLunar, boolean isIntercalation, int year, int month, int day) {
348 | boolean isValid = false;
349 | int dateValue = year * 10000 + month * 100 + day;
350 | // 1582. 10. 5 ~ 1582. 10. 14 is not enable
351 | if ((isLunar ? KOREAN_LUNAR_MIN_VALUE : KOREAN_SOLAR_MIN_VALUE) <= dateValue
352 | && (isLunar ? KOREAN_LUNAR_MAX_VALUE : KOREAN_SOLAR_MAX_VALUE) >= dateValue) {
353 | if (month > 0 && month < 13 && day > 0) {
354 | int dayLimit = isLunar ? getLunarDays(year, month, isIntercalation) : getSolarDays(year, month);
355 | if (!isLunar && year == 1582 && month == 10) {
356 | if (day > 4 && day < 15) {
357 | return false;
358 | } else {
359 | dayLimit += 10;
360 | }
361 | }
362 | if (day <= dayLimit) {
363 | isValid = true;
364 | }
365 | }
366 | }
367 | return isValid;
368 | }
369 |
370 | /**
371 | *
372 | * @param lunarYear
373 | * @param lunarMonth
374 | * @param lunarDay
375 | * @param isIntercalation
376 | * @return
377 | */
378 | public boolean setLunarDate(int lunarYear, int lunarMonth, int lunarDay, boolean isIntercalation) {
379 | boolean isValid = false;
380 | if (checkValidDate(true, isIntercalation, lunarYear, lunarMonth, lunarDay)) {
381 | setLunarYear(lunarYear);
382 | setLunarMonth(lunarMonth);
383 | setLunarDay(lunarDay);
384 | setIntercalation(isIntercalation && (getLunarIntercalationMonth(getLunarData(lunarYear)) == lunarMonth));
385 | setSolarDateByLunarDate(lunarYear, lunarMonth, lunarDay, isIntercalation);
386 | isValid = true;
387 | }
388 | return isValid;
389 | }
390 |
391 | /**
392 | *
393 | * @param solarYear
394 | * @param solarMonth
395 | * @param solarDay
396 | * @return
397 | */
398 | public boolean setSolarDate(int solarYear, int solarMonth, int solarDay) {
399 | boolean isValid = false;
400 | if (checkValidDate(false, false, solarYear, solarMonth, solarDay)) {
401 | setSolarYear(solarYear);
402 | setSolarMonth(solarMonth);
403 | setSolarDay(solarDay);
404 | setLunarDateBySolarDate(solarYear, solarMonth, solarDay);
405 | isValid = true;
406 | }
407 | return isValid;
408 | }
409 |
410 | private void getGapJa() {
411 | int absDays = getLunarAbsDays(lunarYear, lunarMonth, lunarDay, isIntercalation);
412 | if (absDays > 0) {
413 | gapjaYearInx[0] = ((lunarYear + 6) - KOREAN_LUNAR_BASE_YEAR) % KOREAN_CHEONGAN.length;
414 | gapjaYearInx[1] = ((lunarYear + 0) - KOREAN_LUNAR_BASE_YEAR) % KOREAN_GANJI.length;
415 |
416 | int monthCount = this.lunarMonth;
417 | monthCount += 12 * (lunarYear - KOREAN_LUNAR_BASE_YEAR);
418 | gapjaMonthInx[0] = (monthCount + 3) % KOREAN_CHEONGAN.length;
419 | gapjaMonthInx[1] = (monthCount + 1) % KOREAN_GANJI.length;
420 |
421 | gapjaDayInx[0] = (absDays + 4) % KOREAN_CHEONGAN.length;
422 | gapjaDayInx[1] = (absDays + 2) % KOREAN_GANJI.length;
423 | }
424 | }
425 |
426 | /**
427 | *
428 | * @return
429 | */
430 | public String getGapjaString() {
431 | getGapJa();
432 |
433 | StringBuilder gapjaString = new StringBuilder();
434 | gapjaString.append(KOREAN_CHEONGAN[gapjaYearInx[0]]);
435 | gapjaString.append(KOREAN_GANJI[gapjaYearInx[1]]);
436 | gapjaString.append(KOREAN_GAPJA_UNIT[gapjaYearInx[2]]);
437 | gapjaString.append(" ");
438 | gapjaString.append(KOREAN_CHEONGAN[gapjaMonthInx[0]]);
439 | gapjaString.append(KOREAN_GANJI[gapjaMonthInx[1]]);
440 | gapjaString.append(KOREAN_GAPJA_UNIT[gapjaMonthInx[2]]);
441 | gapjaString.append(" ");
442 | gapjaString.append(KOREAN_CHEONGAN[gapjaDayInx[0]]);
443 | gapjaString.append(KOREAN_GANJI[gapjaDayInx[1]]);
444 | gapjaString.append(KOREAN_GAPJA_UNIT[gapjaDayInx[2]]);
445 |
446 | if (isIntercalation()) {
447 | gapjaString.append(" (");
448 | gapjaString.append(INTERCALATION_STR[0]);
449 | gapjaString.append(KOREAN_GAPJA_UNIT[1]);
450 | gapjaString.append(")");
451 | }
452 | return gapjaString.toString();
453 | }
454 |
455 | /**
456 | *
457 | * @return
458 | */
459 | public String getChineseGapJaString() {
460 | getGapJa();
461 |
462 | StringBuilder gapjaString = new StringBuilder();
463 | gapjaString.append(CHINESE_CHEONGAN[gapjaYearInx[0]]);
464 | gapjaString.append(CHINESE_GANJI[gapjaYearInx[1]]);
465 | gapjaString.append(CHINESE_GAPJA_UNIT[gapjaYearInx[2]]);
466 | gapjaString.append(" ");
467 | gapjaString.append(CHINESE_CHEONGAN[gapjaMonthInx[0]]);
468 | gapjaString.append(CHINESE_GANJI[gapjaMonthInx[1]]);
469 | gapjaString.append(CHINESE_GAPJA_UNIT[gapjaMonthInx[2]]);
470 | gapjaString.append(" ");
471 | gapjaString.append(CHINESE_CHEONGAN[gapjaDayInx[0]]);
472 | gapjaString.append(CHINESE_GANJI[gapjaDayInx[1]]);
473 | gapjaString.append(CHINESE_GAPJA_UNIT[gapjaDayInx[2]]);
474 |
475 | if (isIntercalation()) {
476 | gapjaString.append(" (");
477 | gapjaString.append(INTERCALATION_STR[1]);
478 | gapjaString.append(CHINESE_GAPJA_UNIT[1]);
479 | gapjaString.append(")");
480 | }
481 | return gapjaString.toString();
482 | }
483 |
484 | /**
485 | *
486 | * @return
487 | */
488 | public String getLunarIsoFormat() {
489 | String isoStr = String.format("%04d-%02d-%02d", lunarYear, lunarMonth, lunarDay);
490 | if (isIntercalation())
491 | isoStr += " Intercalation";
492 |
493 | return isoStr;
494 | }
495 |
496 | /**
497 | *
498 | * @return
499 | */
500 | public String getSolarIsoFormat() {
501 | String isoStr = String.format("%04d-%02d-%02d", solarYear, solarMonth, solarDay);
502 |
503 | return isoStr;
504 | }
505 |
506 | /**
507 | *
508 | * @return
509 | */
510 | public int getLunarYear() {
511 | return lunarYear;
512 | }
513 |
514 | private void setLunarYear(int lunarYear) {
515 | this.lunarYear = lunarYear;
516 | }
517 |
518 | /**
519 | *
520 | * @return
521 | */
522 | public int getLunarMonth() {
523 | return lunarMonth;
524 | }
525 |
526 | private void setLunarMonth(int lunarMonth) {
527 | this.lunarMonth = lunarMonth;
528 | }
529 |
530 | /**
531 | *
532 | * @return
533 | */
534 | public int getLunarDay() {
535 | return lunarDay;
536 | }
537 |
538 | private void setLunarDay(int lunarDay) {
539 | this.lunarDay = lunarDay;
540 | }
541 |
542 | /**
543 | *
544 | * @return
545 | */
546 | public boolean isIntercalation() {
547 | return isIntercalation;
548 | }
549 |
550 | private void setIntercalation(boolean isIntercalation) {
551 | this.isIntercalation = isIntercalation;
552 | }
553 |
554 | /**
555 | *
556 | * @return
557 | */
558 | public int getSolarYear() {
559 | return solarYear;
560 | }
561 |
562 | private void setSolarYear(int solarYear) {
563 | this.solarYear = solarYear;
564 | }
565 |
566 | /**
567 | *
568 | * @return
569 | */
570 | public int getSolarMonth() {
571 | return solarMonth;
572 | }
573 |
574 | private void setSolarMonth(int solarMonth) {
575 | this.solarMonth = solarMonth;
576 | }
577 |
578 | /**
579 | *
580 | * @return
581 | */
582 | public int getSolarDay() {
583 | return solarDay;
584 | }
585 |
586 | private void setSolarDay(int solarDay) {
587 | this.solarDay = solarDay;
588 | }
589 | }
590 |
--------------------------------------------------------------------------------