├── .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 | --------------------------------------------------------------------------------