├── MANIFEST.in ├── setup.cfg ├── dist ├── korean_lunar_calendar-0.3.1.tar.gz └── korean_lunar_calendar-0.3.1-py3-none-any.whl ├── korean_lunar_calendar ├── __init__.py └── korean_lunar_calendar.py ├── LICENSE ├── setup.py ├── README.rst └── README.md /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include README.rst LICENSE 2 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | description-file = README.rst -------------------------------------------------------------------------------- /dist/korean_lunar_calendar-0.3.1.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usingsky/korean_lunar_calendar_py/HEAD/dist/korean_lunar_calendar-0.3.1.tar.gz -------------------------------------------------------------------------------- /dist/korean_lunar_calendar-0.3.1-py3-none-any.whl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/usingsky/korean_lunar_calendar_py/HEAD/dist/korean_lunar_calendar-0.3.1-py3-none-any.whl -------------------------------------------------------------------------------- /korean_lunar_calendar/__init__.py: -------------------------------------------------------------------------------- 1 | from .korean_lunar_calendar import KoreanLunarCalendar 2 | 3 | __version__ = '0.3.1' 4 | 5 | __all__ = [ 'KoreanLunarCalendar' ] 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2018-2020 Jinil Lee 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Always prefer setuptools over distutils 4 | from setuptools import setup, find_packages 5 | # To use a consistent encoding 6 | from codecs import open 7 | from os import path 8 | 9 | from korean_lunar_calendar import __version__ 10 | 11 | here = path.abspath(path.dirname(__file__)) 12 | 13 | with open(path.join(here, 'README.rst'), encoding='utf-8') as f: 14 | long_description = f.read() 15 | 16 | setup( 17 | name='korean_lunar_calendar', 18 | version=__version__, 19 | description='Korean Lunar Calendar', 20 | long_description=long_description, 21 | packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]), 22 | url='https://github.com/usingsky/korean_lunar_calendar_py', 23 | author='Jinil Lee', 24 | author_email='usingsky@gmail.com', 25 | maintainer='Jinil Lee', 26 | maintainer_email='usingsky@gmail.com', 27 | keywords=['calendar', 'korean', 'lunar'], 28 | license='MIT', 29 | classifiers=[ 30 | 'Development Status :: 3 - Alpha', 31 | 'Intended Audience :: Developers', 32 | 'Intended Audience :: End Users/Desktop', 33 | 'Topic :: Software Development :: Libraries', 34 | 'License :: OSI Approved :: MIT License', 35 | 'Operating System :: OS Independent', 36 | 'Programming Language :: Python :: 2', 37 | 'Programming Language :: Python :: 3', 38 | ] 39 | ) 40 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | korean\_lunar\_calendar\_py 2 | =========================== 3 | 4 | 한국 양음력 변환 5 | 6 | Overview 7 | ^^^^^^^^ 8 | 9 | Here is a library to convert Korean lunar-calendar to Gregorian 10 | calendar. 11 | 12 | Korean calendar and Chinese calendar is same lunar calendar but have 13 | different date. 14 | 15 | This follow the KARI(Korea Astronomy and Space Science Institute) 16 | 17 | 한국 양음력 변환 (한국천문연구원 기준) - 네트워크 연결 불필요 18 | 19 | 음력 변환은 1000년 01월 01일 부터 2050년 11월 18일까지 지원 20 | 양력 변환은 1000년 02월 13일 부터 2050년 12월 31일까지 지원 21 | 22 | :: 23 | 24 | Gregorian calendar (1000-02-13 ~ 2050-12-31) <--> Korean lunar-calendar (1000-01-01 ~ 2050-11-18) 25 | 26 | Install 27 | ^^^^^^^ 28 | 29 | pip install korean\_lunar\_calendar 30 | 31 | To use 32 | ^^^^^^ 33 | 34 | (0) import module 35 | 36 | .. code:: python 37 | 38 | from korean_lunar_calendar import KoreanLunarCalendar 39 | 40 | (1) Korean Solar Date -> Korean Lunar Date (양력 -> 음력) 41 | 42 | .. code:: python 43 | 44 | calendar = KoreanLunarCalendar() 45 | # params : year(년), month(월), day(일) 46 | calendar.setSolarDate(2017, 6, 24) 47 | # Lunar Date (ISO Format) 48 | print(calendar.LunarIsoFormat()) 49 | # Korean GapJa String 50 | print(calendar.getGapJaString()) 51 | # Chinese GapJa String 52 | print(calendar.getChineseGapJaString()) 53 | 54 | :: 55 | 56 | [Result] 57 | 2017-05-01 Intercalation 58 | 정유년 병오월 임오일 (윤월) 59 | 丁酉年 丙午月 壬午日 (閏月) 60 | 61 | (2) Korean Lunar Date -> Korean Solar Date (음력 -> 양력) 62 | 63 | .. code:: python 64 | 65 | # params : year(년), month(월), day(일), intercalation(윤달여부) 66 | calendar.setLunarDate(1956, 1, 21, False) 67 | # Solar Date (ISO Format) 68 | print(calendar.SolarIsoFormat()) 69 | # Korean GapJa String 70 | print(calendar.getGapJaString()) 71 | # Chinese GapJa String 72 | print(calendar.getChineseGapJaString()) 73 | 74 | :: 75 | 76 | [Result] 77 | 1956-03-03 78 | 병신년 경인월 기사일 79 | 丙申年 庚寅月 己巳日 80 | 81 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # korean_lunar_calendar 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 | - [Install](#install) 20 | - [Import](#import) 21 | - [Example](#example) 22 | - [Validation](#validation) 23 | - [Other languages](#other-languages) 24 | 25 | ## Install 26 | 27 | ```bash 28 | pip install korean_lunar_calendar 29 | ``` 30 | 31 | ## Import 32 | 33 | ```python 34 | from korean_lunar_calendar import KoreanLunarCalendar 35 | ``` 36 | 37 | ## Example 38 | 39 | Korean Solar Date -> Korean Lunar Date (양력 -> 음력) 40 | 41 | ```python 42 | calendar = KoreanLunarCalendar() 43 | 44 | # params : year(년), month(월), day(일) 45 | calendar.setSolarDate(2017, 6, 24) 46 | 47 | # Lunar Date (ISO Format) 48 | print(calendar.LunarIsoFormat()) 49 | 50 | # Korean GapJa String 51 | print(calendar.getGapJaString()) 52 | 53 | # Chinese GapJa String 54 | print(calendar.getChineseGapJaString()) 55 | ``` 56 | 57 | ``` 58 | [Result] 59 | 2017-05-01 Intercalation 60 | 정유년 병오월 임오일 (윤월) 61 | 丁酉年 丙午月 壬午日 (閏月) 62 | ``` 63 | 64 | Korean Lunar Date -> Korean Solar Date (음력 -> 양력) 65 | 66 | ```python 67 | calendar = KoreanLunarCalendar() 68 | 69 | # params : year(년), month(월), day(일), intercalation(윤달여부) 70 | calendar.setLunarDate(1956, 1, 21, False) 71 | 72 | # Solar Date (ISO Format) 73 | print(calendar.SolarIsoFormat()) 74 | 75 | # Korean GapJa String 76 | print(calendar.getGapJaString()) 77 | 78 | # Chinese GapJa String 79 | print(calendar.getChineseGapJaString()) 80 | ``` 81 | 82 | ``` 83 | [Result] 84 | 1956-03-03 85 | 병신년 경인월 기사일 86 | 丙申年 庚寅月 己巳日 87 | ``` 88 | 89 | ## Validation 90 | 91 | Check for invalid date input 92 | 93 | ```python 94 | calendar = KoreanLunarCalendar() 95 | 96 | # invald date 97 | calendar.setLunarDate(99, 1, 1, False) # => return False 98 | calendar.setSolarDate(2051, 1, 1) # => return False 99 | 100 | # OK 101 | calendar.setLunarDate(1000, 1, 1, False) # => return True 102 | calendar.setSolarDate(2050, 12, 31) # => return True 103 | ``` 104 | 105 | ## Other languages 106 | 107 | - Java : [https://github.com/usingsky/KoreanLunarCalendar](https://github.com/usingsky/KoreanLunarCalendar) 108 | - Python : [https://github.com/usingsky/korean_lunar_calendar_py](https://github.com/usingsky/korean_lunar_calendar_py) 109 | - Javascript : [https://github.com/usingsky/korean_lunar_calendar_js](https://github.com/usingsky/korean_lunar_calendar_js) 110 | -------------------------------------------------------------------------------- /korean_lunar_calendar/korean_lunar_calendar.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | """ 4 | KoreanLunarCalendar 5 | Here is a library to convert Korean lunar-calendar to Gregorian calendar. 6 | Korean calendar and Chinese calendar is same lunar calendar but have different date. 7 | This follow the KARI(Korea Astronomy and Space Science Institute) 8 | @author : usingsky@gmail.com 9 | """ 10 | 11 | import datetime 12 | class KoreanLunarCalendar(object) : 13 | KOREAN_LUNAR_MIN_VALUE = 10000101 14 | KOREAN_LUNAR_MAX_VALUE = 20501118 15 | KOREAN_SOLAR_MIN_VALUE = 10000213 16 | KOREAN_SOLAR_MAX_VALUE = 20501231 17 | 18 | KOREAN_LUNAR_BASE_YEAR = 1000 19 | SOLAR_LUNAR_DAY_DIFF = 43 20 | 21 | LUNAR_SMALL_MONTH_DAY = 29 22 | LUNAR_BIG_MONTH_DAY = 30 23 | SOLAR_SMALL_YEAR_DAY = 365 24 | SOLAR_BIG_YEAR_DAY = 366 25 | 26 | SOLAR_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 29] 27 | KOREAN_CHEONGAN = [0xac11, 0xc744, 0xbcd1, 0xc815, 0xbb34, 0xae30, 0xacbd, 0xc2e0, 0xc784, 0xacc4] 28 | KOREAN_GANJI = [0xc790, 0xcd95, 0xc778, 0xbb18, 0xc9c4, 0xc0ac, 0xc624, 0xbbf8, 0xc2e0, 0xc720, 0xc220, 0xd574] 29 | KOREAN_GAPJA_UNIT = [0xb144, 0xc6d4, 0xc77c] 30 | 31 | CHINESE_CHEONGAN = [0x7532, 0x4e59, 0x4e19, 0x4e01, 0x620a, 0x5df1, 0x5e9a, 0x8f9b, 0x58ec, 0x7678] 32 | CHINESE_GANJI = [0x5b50, 0x4e11, 0x5bc5, 0x536f, 0x8fb0, 0x5df3, 0x5348, 0x672a, 0x7533, 0x9149, 0x620c, 0x4ea5] 33 | CHINESE_GAPJA_UNIT = [0x5e74, 0x6708, 0x65e5] 34 | 35 | INTERCALATION_STR = [0xc724, 0x958f] 36 | 37 | KOREAN_LUNAR_DATA = [ 38 | 0x82c60a57, 0x82fec52b, 0x82c40d2a, 0x82c60d55, 0xc30095ad, 0x82c4056a, 0x82c6096d, 0x830054dd, 0xc2c404ad, 0x82c40a4d, 39 | 0x83002e4d, 0x82c40b26, 0xc300ab56, 0x82c60ad5, 0x82c4035a, 0x8300697a, 0xc2c6095b, 0x82c4049b, 0x83004a9b, 0x82c40a4b, 40 | 0xc301caa5, 0x82c406aa, 0x82c60ad5, 0x830092dd, 0xc2c402b5, 0x82c60957, 0x82fe54ae, 0x82c60c97, 0xc2c4064b, 0x82ff254a, 41 | 0x82c60da9, 0x8300a6b6, 0xc2c6066d, 0x82c4026e, 0x8301692e, 0x82c4092e, 0xc2c40c96, 0x83004d95, 0x82c40d4a, 0x8300cd69, 42 | 0xc2c40b58, 0x82c80d6b, 0x8301926b, 0x82c4025d, 0xc2c4092b, 0x83005aab, 0x82c40a95, 0x82c40b4a, 0xc3021eab, 0x82c402d5, 43 | 0x8301b55a, 0x82c604bb, 0xc2c4025b, 0x83007537, 0x82c4052b, 0x82c40695, 0xc3003755, 0x82c406aa, 0x8303cab5, 0x82c40275, 44 | 0xc2c404b6, 0x83008a5e, 0x82c40a56, 0x82c40d26, 0xc3005ea6, 0x82c60d55, 0x82c405aa, 0x83001d6a, 0xc2c6096d, 0x8300b4af, 45 | 0x82c4049d, 0x82c40a4d, 0xc3007d2d, 0x82c40aa6, 0x82c60b55, 0x830045d5, 0xc2c4035a, 0x82c6095d, 0x83011173, 0x82c4045b, 46 | 0xc3009a4f, 0x82c4064b, 0x82c40aa5, 0x83006b69, 0xc2c606b5, 0x82c402da, 0x83002ab6, 0x82c60937, 0xc2fec497, 0x82c60c97, 47 | 0x82c4064b, 0x82fe86aa, 0xc2c60da5, 0x82c405b4, 0x83034a6d, 0x82c402ae, 0xc2c40e61, 0x83002d2e, 0x82c40c96, 0x83009d4d, 48 | 0x82c40d4a, 0x82c60d65, 0x83016595, 0x82c6055d, 0xc2c4026d, 0x83002a5d, 0x82c4092b, 0x8300aa97, 0xc2c40a95, 0x82c40b4a, 49 | 0x83008b5a, 0x82c60ad5, 0xc2c6055b, 0x830042b7, 0x82c40457, 0x82c4052b, 0xc3001d2b, 0x82c40695, 0x8300972d, 0x82c405aa, 50 | 0xc2c60ab5, 0x830054ed, 0x82c404b6, 0x82c60a57, 0xc2ff344e, 0x82c40d26, 0x8301be92, 0x82c60d55, 0xc2c405aa, 0x830089ba, 51 | 0x82c6096d, 0x82c404ae, 0xc3004a9d, 0x82c40a4d, 0x82c40d25, 0x83002f25, 0xc2c40b54, 0x8303ad69, 0x82c402da, 0x82c6095d, 52 | 0xc301649b, 0x82c4049b, 0x82c40a4b, 0x83004b4b, 0xc2c406a5, 0x8300bb53, 0x82c406b4, 0x82c60ab6, 0xc3018956, 0x82c60997, 53 | 0x82c40497, 0x83004697, 0xc2c4054b, 0x82fec6a5, 0x82c60da5, 0x82c405ac, 0xc303aab5, 0x82c4026e, 0x82c4092e, 0x83006cae, 54 | 0xc2c40c96, 0x82c40d4a, 0x83002f4a, 0x82c60d55, 0xc300b56b, 0x82c6055b, 0x82c4025d, 0x8300793d, 0xc2c40927, 0x82c40a95, 55 | 0x83015d15, 0x82c40b4a, 0xc2c60b55, 0x830112d5, 0x82c604db, 0x82fe925e, 0xc2c60a57, 0x82c4052b, 0x83006aab, 0x82c40695, 56 | 0xc2c406aa, 0x83003baa, 0x82c60ab5, 0x8300b4b7, 0xc2c404ae, 0x82c60a57, 0x82fe752e, 0x82c40d26, 0xc2c60e93, 0x830056d5, 57 | 0x82c405aa, 0x82c609b5, 0xc300256d, 0x82c404ae, 0x8301aa4d, 0x82c40a4d, 0xc2c40d26, 0x83006d65, 0x82c40b52, 0x82c60d6a, 58 | 0xc30026da, 0x82c6095d, 0x8301c49d, 0x82c4049b, 0xc2c40a4b, 0x83008aab, 0x82c406a5, 0x82c40b54, 0xc3004bb4, 0x82c60ab6, 59 | 0x82c6095b, 0x83002537, 0xc2c40497, 0x8300964f, 0x82c4054b, 0x82c406a5, 0xc30176c5, 0x82c405ac, 0x82c60ab6, 0x8301386e, 60 | 0xc2c4092e, 0x8300cc97, 0x82c40c96, 0x82c40d4a, 0xc3008daa, 0x82c60b55, 0x82c4056a, 0x83025adb, 0xc2c4025d, 0x82c4092e, 61 | 0x83002d2b, 0x82c40a95, 0xc3009d4d, 0x82c40b2a, 0x82c60b55, 0x83007575, 0xc2c404da, 0x82c60a5b, 0x83004557, 0x82c4052b, 62 | 0xc301ca93, 0x82c40693, 0x82c406aa, 0x83008ada, 0xc2c60ae5, 0x82c404b6, 0x83004aae, 0x82c60a57, 0xc2c40527, 0x82ff2526, 63 | 0x82c60e53, 0x8300a6cb, 0xc2c405aa, 0x82c605ad, 0x830164ad, 0x82c404ae, 0xc2c40a4e, 0x83004d4d, 0x82c40d26, 0x8300bd53, 64 | 0xc2c40b52, 0x82c60b6a, 0x8301956a, 0x82c60557, 0xc2c4049d, 0x83015a1b, 0x82c40a4b, 0x82c40aa5, 0xc3001ea5, 0x82c40b52, 65 | 0x8300bb5a, 0x82c60ab6, 0xc2c6095b, 0x830064b7, 0x82c40497, 0x82c4064b, 0xc300374b, 0x82c406a5, 0x8300b6b3, 0x82c405ac, 66 | 0xc2c60ab6, 0x830182ad, 0x82c4049e, 0x82c40a4d, 0xc3005d4b, 0x82c40b25, 0x82c40b52, 0x83012e52, 0xc2c60b5a, 0x8300a95e, 67 | 0x82c6095b, 0x82c4049b, 0xc3006a57, 0x82c40a4b, 0x82c40aa5, 0x83004ba5, 0xc2c406d4, 0x8300cad6, 0x82c60ab6, 0x82c60937, 68 | 0x8300849f, 0x82c40497, 0x82c4064b, 0x82fe56ca, 0xc2c60da5, 0x82c405aa, 0x83001d6c, 0x82c60a6e, 0xc300b92f, 0x82c4092e, 69 | 0x82c40c96, 0x83007d55, 0xc2c40d4a, 0x82c60d55, 0x83013555, 0x82c4056a, 0xc2c60a6d, 0x83001a5d, 0x82c4092b, 0x83008a5b, 70 | 0xc2c40a95, 0x82c40b2a, 0x83015b2a, 0x82c60ad5, 0xc2c404da, 0x83001cba, 0x82c60a57, 0x8300952f, 0xc2c40527, 0x82c40693, 71 | 0x830076b3, 0x82c406aa, 0xc2c60ab5, 0x83003575, 0x82c404b6, 0x8300ca67, 0xc2c40a2e, 0x82c40d16, 0x83008e96, 0x82c40d4a, 72 | 0xc2c60daa, 0x830055ea, 0x82c6056d, 0x82c404ae, 0xc301285d, 0x82c40a2d, 0x8300ad17, 0x82c40aa5, 0xc2c40b52, 0x83007d74, 73 | 0x82c60ada, 0x82c6055d, 0xc300353b, 0x82c4045b, 0x82c40a2b, 0x83011a2b, 0xc2c40aa5, 0x83009b55, 0x82c406b2, 0x82c60ad6, 74 | 0xc3015536, 0x82c60937, 0x82c40457, 0x83003a57, 0xc2c4052b, 0x82feaaa6, 0x82c60d95, 0x82c405aa, 0xc3017aac, 0x82c60a6e, 75 | 0x82c4052e, 0x83003cae, 0xc2c40a56, 0x8300bd2b, 0x82c40d2a, 0x82c60d55, 0xc30095ad, 0x82c4056a, 0x82c60a6d, 0x8300555d, 76 | 0xc2c4052b, 0x82c40a8d, 0x83002e55, 0x82c40b2a, 0xc300ab56, 0x82c60ad5, 0x82c404da, 0x83006a7a, 0xc2c60a57, 0x82c4051b, 77 | 0x83014a17, 0x82c40653, 0xc301c6a9, 0x82c405aa, 0x82c60ab5, 0x830092bd, 0xc2c402b6, 0x82c60a37, 0x82fe552e, 0x82c40d16, 78 | 0x82c60e4b, 0x82fe3752, 0x82c60daa, 0x8301b5b4, 0xc2c6056d, 0x82c402ae, 0x83007a3d, 0x82c40a2d, 0xc2c40d15, 0x83004d95, 79 | 0x82c40b52, 0x8300cb69, 0xc2c60ada, 0x82c6055d, 0x8301925b, 0x82c4045b, 0xc2c40a2b, 0x83005aab, 0x82c40a95, 0x82c40b52, 80 | 0xc3001eaa, 0x82c60ab6, 0x8300c55b, 0x82c604b7, 0xc2c40457, 0x83007537, 0x82c4052b, 0x82c40695, 0xc3014695, 0x82c405aa, 81 | 0x8300cab5, 0x82c60a6e, 0xc2c404ae, 0x83008a5e, 0x82c40a56, 0x82c40d2a, 0xc3006eaa, 0x82c60d55, 0x82c4056a, 0x8301295a, 82 | 0xc2c6095d, 0x8300b4af, 0x82c4049b, 0x82c40a4d, 0xc3007d2d, 0x82c40b2a, 0x82c60b55, 0x830045d5, 0xc2c402da, 0x82c6095b, 83 | 0x83011157, 0x82c4049b, 0xc3009a4f, 0x82c4064b, 0x82c406a9, 0x83006aea, 0xc2c606b5, 0x82c402b6, 0x83002aae, 0x82c60937, 84 | 0xc2ffb496, 0x82c40c96, 0x82c60e4b, 0x82fe76b2, 0xc2c60daa, 0x82c605ad, 0x8300336d, 0x82c4026e, 0xc2c4092e, 0x83002d2d, 85 | 0x82c40c95, 0x83009d4d, 0xc2c40b4a, 0x82c60b69, 0x8301655a, 0x82c6055b, 0xc2c4025d, 0x83002a5b, 0x82c4092b, 0x8300aa97, 86 | 0xc2c40695, 0x82c4074a, 0x83008b5a, 0x82c60ab6, 0xc2c6053b, 0x830042b7, 0x82c40257, 0x82c4052b, 0xc3001d2b, 0x82c40695, 87 | 0x830096ad, 0x82c405aa, 0xc2c60ab5, 0x830054ed, 0x82c404ae, 0x82c60a57, 0xc2ff344e, 0x82c40d2a, 0x8301bd94, 0x82c60b55, 88 | 0x82c4056a, 0x8300797a, 0x82c6095d, 0x82c404ae, 0xc3004a9b, 0x82c40a4d, 0x82c40d25, 0x83011aaa, 0xc2c60b55, 0x8300956d, 89 | 0x82c402da, 0x82c6095b, 0xc30054b7, 0x82c40497, 0x82c40a4b, 0x83004b4b, 0xc2c406a9, 0x8300cad5, 0x82c605b5, 0x82c402b6, 90 | 0xc300895e, 0x82c6092f, 0x82c40497, 0x82fe4696, 0xc2c40d4a, 0x8300cea5, 0x82c60d69, 0x82c6056d, 0xc301a2b5, 0x82c4026e, 91 | 0x82c4092e, 0x83006cad, 0xc2c40c95, 0x82c40d4a, 0x83002f4a, 0x82c60b59, 0xc300c56d, 0x82c6055b, 0x82c4025d, 0x8300793b, 92 | 0xc2c4092b, 0x82c40a95, 0x83015b15, 0x82c406ca, 0xc2c60ad5, 0x830112b6, 0x82c604bb, 0x8300925f, 0xc2c40257, 0x82c4052b, 93 | 0x82fe6aaa, 0x82c60e95, 0xc2c406aa, 0x83003baa, 0x82c60ab5, 0x8300b4b7, 0xc2c404ae, 0x82c60a57, 0x82fe752d, 0x82c40d26, 94 | 0xc2c60d95, 0x830055d5, 0x82c4056a, 0x82c6096d, 0xc300255d, 0x82c404ae, 0x8300aa4f, 0x82c40a4d, 0xc2c40d25, 0x83006d69, 95 | 0x82c60b55, 0x82c4035a, 0xc3002aba, 0x82c6095b, 0x8301c49b, 0x82c40497, 0xc2c40a4b, 0x83008b2b, 0x82c406a5, 0x82c406d4, 96 | 0xc3034ab5, 0x82c402b6, 0x82c60937, 0x8300252f, 0xc2c40497, 0x82fe964e, 0x82c40d4a, 0x82c60ea5, 0xc30166a9, 0x82c6056d, 97 | 0x82c402b6, 0x8301385e, 0xc2c4092e, 0x8300bc97, 0x82c40a95, 0x82c40d4a, 0xc3008daa, 0x82c60b4d, 0x82c6056b, 0x830042db, 98 | 0xc2c4025d, 0x82c4092d, 0x83002d2b, 0x82c40a95, 0xc3009b4d, 0x82c406aa, 0x82c60ad5, 0x83006575, 0xc2c604bb, 0x82c4025b, 99 | 0x83013457, 0x82c4052b, 0xc2ffba94, 0x82c60e95, 0x82c406aa, 0x83008ada, 0xc2c609b5, 0x82c404b6, 0x83004aae, 0x82c60a4f, 100 | 0xc2c20526, 0x83012d26, 0x82c60d55, 0x8301a5a9, 0xc2c4056a, 0x82c6096d, 0x8301649d, 0x82c4049e, 0xc2c40a4d, 0x83004d4d, 101 | 0x82c40d25, 0x8300bd53, 0xc2c40b54, 0x82c60b5a, 0x8301895a, 0x82c6095b, 0xc2c4049b, 0x83004a97, 0x82c40a4b, 0x82c40aa5, 102 | 0xc3001ea5, 0x82c406d4, 0x8302badb, 0x82c402b6, 0xc2c60937, 0x830064af, 0x82c40497, 0x82c4064b, 0xc2fe374a, 0x82c60da5, 103 | 0x8300b6b5, 0x82c6056d, 0xc2c402ae, 0x8300793e, 0x82c4092e, 0x82c40c96, 0xc3015d15, 0x82c40d4a, 0x82c60da5, 0x83013555, 104 | 0xc2c4056a, 0x83007a7a, 0x82c60a5d, 0x82c4092d, 0xc3006aab, 0x82c40a95, 0x82c40b4a, 0x83004baa, 0xc2c60ad5, 0x82c4055a, 105 | 0x830128ba, 0x82c60a5b, 0xc3007537, 0x82c4052b, 0x82c40693, 0x83015715, 0xc2c406aa, 0x82c60ad5, 0x830035b5, 0x82c404b6, 106 | 0xc3008a5e, 0x82c40a4e, 0x82c40d26, 0x83006ea6, 0xc2c40d52, 0x82c60daa, 0x8301466a, 0x82c6056d, 0xc2c404ae, 0x83003a9d, 107 | 0x82c40a4d, 0x83007d2b, 0xc2c40b25, 0x82c40d52, 0x83015d54, 0x82c60b5a, 0xc2c6055d, 0x8300355b, 0x82c4049b, 0x83007657, 108 | 0x82c40a4b, 0x82c40aa5, 0x83006b65, 0x82c406d2, 0xc2c60ada, 0x830045b6, 0x82c60937, 0x82c40497, 0xc3003697, 0x82c4064d, 109 | 0x82fe76aa, 0x82c60da5, 0xc2c405aa, 0x83005aec, 0x82c60aae, 0x82c4092e, 0xc3003d2e, 0x82c40c96, 0x83018d45, 0x82c40d4a, 110 | 0xc2c60d55, 0x83016595, 0x82c4056a, 0x82c60a6d, 0xc300455d, 0x82c4052d, 0x82c40a95, 0x83013c95, 0xc2c40b4a, 0x83017b4a, 111 | 0x82c60ad5, 0x82c4055a, 0xc3015a3a, 0x82c60a5b, 0x82c4052b, 0x83014a17, 0xc2c40693, 0x830096ab, 0x82c406aa, 0x82c60ab5, 112 | 0xc30064f5, 0x82c404b6, 0x82c60a57, 0x82fe452e, 0xc2c40d16, 0x82c60e93, 0x82fe3752, 0x82c60daa, 0xc30175aa, 0x82c6056d, 113 | 0x82c404ae, 0x83015a1d, 0xc2c40a2d, 0x82c40d15, 0x83004da5, 0x82c40b52, 0xc3009d6a, 0x82c60ada, 0x82c6055d, 0x8301629b, 114 | 0xc2c4045b, 0x82c40a2b, 0x83005b2b, 0x82c40a95, 0xc2c40b52, 0x83012ab2, 0x82c60ad6, 0x83017556, 0xc2c60537, 0x82c40457, 115 | 0x83005657, 0x82c4052b, 0xc2c40695, 0x83003795, 0x82c405aa, 0x8300aab6, 0xc2c60a6d, 0x82c404ae, 0x83006a6e, 0x82c40a56, 116 | 0xc2c40d2a, 0x83005eaa, 0x82c60d55, 0x82c405aa, 0xc3003b6a, 0x82c60a6d, 0x830074bd, 0x82c404ab, 0xc2c40a8d, 0x83005d55, 117 | 0x82c40b2a, 0x82c60b55, 0xc30045d5, 0x82c404da, 0x82c6095d, 0x83002557, 0xc2c4049b, 0x83006a97, 0x82c4064b, 0x82c406a9, 118 | 0x83004baa, 0x82c606b5, 0x82c402ba, 0x83002ab6, 0xc2c60937, 0x82fe652e, 0x82c40d16, 0x82c60e4b, 0xc2fe56d2, 0x82c60da9, 119 | 0x82c605b5, 0x8300336d, 0xc2c402ae, 0x82c40a2e, 0x83002e2d, 0x82c40c95, 0xc3006d55, 0x82c40b52, 0x82c60b69, 0x830045da, 120 | 0xc2c6055d, 0x82c4025d, 0x83003a5b, 0x82c40a2b, 0xc3017a8b, 0x82c40a95, 0x82c40b4a, 0x83015b2a, 0xc2c60ad5, 0x82c6055b, 121 | 0x830042b7, 0x82c40257, 0xc300952f, 0x82c4052b, 0x82c40695, 0x830066d5, 0xc2c405aa, 0x82c60ab5, 0x8300456d, 0x82c404ae, 122 | 0xc2c60a57, 0x82ff3456, 0x82c40d2a, 0x83017e8a, 0xc2c60d55, 0x82c405aa, 0x83005ada, 0x82c6095d, 0xc2c404ae, 0x83004aab, 123 | 0x82c40a4d, 0x83008d2b, 0xc2c40b29, 0x82c60b55, 0x83007575, 0x82c402da, 0xc2c6095d, 0x830054d7, 0x82c4049b, 0x82c40a4b, 124 | 0xc3013a4b, 0x82c406a9, 0x83008ad9, 0x82c606b5, 0xc2c402b6, 0x83015936, 0x82c60937, 0x82c40497, 0xc2fe4696, 0x82c40e4a, 125 | 0x8300aea6, 0x82c60da9, 0xc2c605ad, 0x830162ad, 0x82c402ae, 0x82c4092e, 0xc3005cad, 0x82c40c95, 0x82c40d4a, 0x83013d4a, 126 | 0xc2c60b69, 0x8300757a, 0x82c6055b, 0x82c4025d, 0xc300595b, 0x82c4092b, 0x82c40a95, 0x83004d95, 0xc2c40b4a, 0x82c60b55, 127 | 0x830026d5, 0x82c6055b, 0xc3006277, 0x82c40257, 0x82c4052b, 0x82fe5aaa, 0xc2c60e95, 0x82c406aa, 0x83003baa, 0x82c60ab5, 128 | 0x830084bd, 0x82c404ae, 0x82c60a57, 0x82fe554d, 0xc2c40d26, 0x82c60d95, 0x83014655, 0x82c4056a, 0xc2c609ad, 0x8300255d, 129 | 0x82c404ae, 0x83006a5b, 0xc2c40a4d, 0x82c40d25, 0x83005da9, 0x82c60b55, 0xc2c4056a, 0x83002ada, 0x82c6095d, 0x830074bb, 130 | 0xc2c4049b, 0x82c40a4b, 0x83005b4b, 0x82c406a9, 0xc2c40ad4, 0x83024bb5, 0x82c402b6, 0x82c6095b, 0xc3002537, 0x82c40497, 131 | 0x82fe6656, 0x82c40e4a, 0xc2c60ea5, 0x830156a9, 0x82c605b5, 0x82c402b6, 0xc30138ae, 0x82c4092e, 0x83017c8d, 0x82c40c95, 132 | 0xc2c40d4a, 0x83016d8a, 0x82c60b69, 0x82c6056d, 0xc301425b, 0x82c4025d, 0x82c4092d, 0x83002d2b, 0xc2c40a95, 0x83007d55, 133 | 0x82c40b4a, 0x82c60b55, 0xc3015555, 0x82c604db, 0x82c4025b, 0x83013857, 0xc2c4052b, 0x83008a9b, 0x82c40695, 0x82c406aa, 134 | 0xc3006aea, 0x82c60ab5, 0x82c404b6, 0x83004aae, 0xc2c60a57, 0x82c40527, 0x82fe3726, 0x82c60d95, 0xc30076b5, 0x82c4056a, 135 | 0x82c609ad, 0x830054dd, 0xc2c404ae, 0x82c40a4e, 0x83004d4d, 0x82c40d25, 0xc3008d59, 0x82c40b54, 0x82c60d6a, 0x8301695a, 136 | 0xc2c6095b, 0x82c4049b, 0x83004a9b, 0x82c40a4b, 0xc300ab27, 0x82c406a5, 0x82c406d4, 0x83026b75, 0xc2c402b6, 0x82c6095b, 137 | 0x830054b7, 0x82c40497, 0xc2c4064b, 0x82fe374a, 0x82c60ea5, 0x830086d9, 0xc2c605ad, 0x82c402b6, 0x8300596e, 0x82c4092e, 138 | 0xc2c40c96, 0x83004e95, 0x82c40d4a, 0x82c60da5, 0xc3002755, 0x82c4056c, 0x83027abb, 0x82c4025d, 0xc2c4092d, 0x83005cab, 139 | 0x82c40a95, 0x82c40b4a, 0xc3013b4a, 0x82c60b55, 0x8300955d, 0x82c404ba, 0xc2c60a5b, 0x83005557, 0x82c4052b, 0x82c40a95, 140 | 0xc3004b95, 0x82c406aa, 0x82c60ad5, 0x830026b5, 0xc2c404b6, 0x83006a6e, 0x82c60a57, 0x82c40527, 0xc2fe56a6, 0x82c60d93, 141 | 0x82c405aa, 0x83003b6a, 0xc2c6096d, 0x8300b4af, 0x82c404ae, 0x82c40a4d, 0xc3016d0d, 0x82c40d25, 0x82c40d52, 0x83005dd4, 142 | 0xc2c60b6a, 0x82c6096d, 0x8300255b, 0x82c4049b, 0xc3007a57, 0x82c40a4b, 0x82c40b25, 0x83015b25, 0xc2c406d4, 0x82c60ada, 143 | 0x830138b6] 144 | 145 | def __init__(self): 146 | self.lunarYear = 0 147 | self.lunarMonth = 0 148 | self.lunarDay = 0 149 | self.isIntercalation = False 150 | 151 | self.solarYear = 0 152 | self.solarMonth = 0 153 | self.solarDay = 0 154 | 155 | self.__gapjaYearInx = [0, 0, 0] 156 | self.__gapjaMonthInx = [0, 0, 1] 157 | self.__gapjaDayInx = [0, 0, 2] 158 | 159 | 160 | def LunarIsoFormat(self): 161 | dateStr = "%04d-%02d-%02d" % (self.lunarYear, self.lunarMonth, self.lunarDay) 162 | if self.isIntercalation : 163 | dateStr += " Intercalation" 164 | return dateStr 165 | 166 | def SolarIsoFormat(self): 167 | return "%04d-%02d-%02d" % (self.solarYear, self.solarMonth, self.solarDay) 168 | 169 | def __getLunarData(self, year): 170 | return self.KOREAN_LUNAR_DATA[year - self.KOREAN_LUNAR_BASE_YEAR] 171 | 172 | def __getLunarIntercalationMonth(self, lunarData): 173 | return (lunarData >> 12) & 0x000F 174 | 175 | def __getLunarDays(self, year, month=None, isIntercalation=None): 176 | lunarData = self.__getLunarData(year) 177 | 178 | if month is not None and isIntercalation is not None : 179 | if (isIntercalation == True) and (self.__getLunarIntercalationMonth(lunarData) == month): 180 | days = self.LUNAR_BIG_MONTH_DAY if ((lunarData >>16) & 0x01) > 0 else self.LUNAR_SMALL_MONTH_DAY 181 | else: 182 | days = self.LUNAR_BIG_MONTH_DAY if ((lunarData >> (12 - month)) & 0x01) > 0 else self.LUNAR_SMALL_MONTH_DAY 183 | else: 184 | days = (lunarData >> 17) & 0x01FF 185 | return days 186 | 187 | def __getLunarDaysBeforeBaseYear(self, year): 188 | days = 0 189 | for baseYear in range(self.KOREAN_LUNAR_BASE_YEAR, year+1): 190 | days += self.__getLunarDays(baseYear) 191 | return days 192 | 193 | def __getLunarDaysBeforeBaseMonth(self, year, month, isIntercalation): 194 | days = 0 195 | if (year >= self.KOREAN_LUNAR_BASE_YEAR) and (month > 0): 196 | for baseMonth in range(1, month+1): 197 | days += self.__getLunarDays(year, baseMonth, False) 198 | 199 | if isIntercalation == True: 200 | intercalationMonth = self.__getLunarIntercalationMonth(self.__getLunarData(year)) 201 | if (intercalationMonth > 0) and intercalationMonth < month+1: 202 | days += self.__getLunarDays(year, intercalationMonth, True) 203 | return days 204 | 205 | def __getLunarAbsDays(self, year, month, day, isIntercalation): 206 | days = self.__getLunarDaysBeforeBaseYear(year-1) + self.__getLunarDaysBeforeBaseMonth(year, month-1, True) + day 207 | if (isIntercalation == True) and (self.__getLunarIntercalationMonth(self.__getLunarData(year)) == month): 208 | days += self.__getLunarDays(year, month, False) 209 | return days 210 | 211 | def __isSolarIntercalationYear(self, lunarData): 212 | return ((lunarData >> 30) & 0x01) > 0 213 | 214 | def __getSolarDays(self, year, month=None): 215 | lunarData = self.__getLunarData(year) 216 | if month is not None : 217 | days = self.SOLAR_DAYS[12] if (month == 2) and self.__isSolarIntercalationYear(lunarData) else self.SOLAR_DAYS[month - 1] 218 | else: 219 | days = self.SOLAR_BIG_YEAR_DAY if self.__isSolarIntercalationYear(lunarData) else self.SOLAR_SMALL_YEAR_DAY 220 | return days 221 | 222 | def __getSolarDaysBeforeBaseYear(self, year): 223 | days = 0 224 | for baseYear in range(self.KOREAN_LUNAR_BASE_YEAR, year+1): 225 | days += self.__getSolarDays(baseYear) 226 | return days 227 | 228 | def __getSolarDaysBeforeBaseMonth(self, year, month): 229 | days = 0 230 | for baseMonth in range(1, month+1): 231 | days += self.__getSolarDays(year, baseMonth) 232 | return days 233 | 234 | def __getSolarAbsDays(self, year, month, day): 235 | days = self.__getSolarDaysBeforeBaseYear(year-1) + self.__getSolarDaysBeforeBaseMonth(year, month-1) + day 236 | days -= self.SOLAR_LUNAR_DAY_DIFF 237 | return days 238 | 239 | def __setSolarDateByLunarDate(self, lunarYear, lunarMonth, lunarDay, isIntercalation): 240 | absDays = self.__getLunarAbsDays(lunarYear, lunarMonth, lunarDay, isIntercalation) 241 | solarYear = 0 242 | solarMonth = 0 243 | solarDay = 0 244 | 245 | solarYear = lunarYear if (absDays < self.__getSolarAbsDays(lunarYear+1, 1, 1)) else lunarYear+1 246 | 247 | for month in range(12, 0, -1) : 248 | absDaysByMonth = self.__getSolarAbsDays(solarYear, month, 1) 249 | if (absDays >= absDaysByMonth) : 250 | solarMonth = month 251 | solarDay = absDays - absDaysByMonth +1 252 | break 253 | 254 | self.solarYear = solarYear 255 | self.solarMonth = solarMonth 256 | self.solarDay = solarDay 257 | 258 | def __setLunarDateBySolarDate(self, solarYear, solarMonth, solarDay): 259 | absDays = self.__getSolarAbsDays(solarYear, solarMonth, solarDay) 260 | lunarYear = solarYear if (absDays >= self.__getLunarAbsDays(solarYear, 1, 1, False)) else solarYear-1 261 | lunarMonth = 0 262 | lunarDay = 0 263 | isIntercalation = False 264 | 265 | for month in range(12, 0, -1) : 266 | absDaysByMonth = self.__getLunarAbsDays(lunarYear, month, 1, False) 267 | if absDays >= absDaysByMonth: 268 | lunarMonth = month 269 | if self.__getLunarIntercalationMonth(self.__getLunarData(lunarYear)) == month : 270 | isIntercalation = absDays >= self.__getLunarAbsDays(lunarYear, month, 1, True) 271 | 272 | lunarDay = absDays - self.__getLunarAbsDays(lunarYear, lunarMonth, 1, isIntercalation) + 1 273 | break 274 | 275 | self.lunarYear = lunarYear 276 | self.lunarMonth = lunarMonth 277 | self.lunarDay = lunarDay 278 | self.isIntercalation = isIntercalation 279 | 280 | def __checkValidDate(self, isLunar, isIntercalation, year, month, day): 281 | isValid = False 282 | dateValue = year*10000 + month*100 + day 283 | #1582. 10. 5 ~ 1582. 10. 14 is not valid 284 | minValue = self.KOREAN_LUNAR_MIN_VALUE if isLunar else self.KOREAN_SOLAR_MIN_VALUE 285 | maxValue = self.KOREAN_LUNAR_MAX_VALUE if isLunar else self.KOREAN_SOLAR_MAX_VALUE 286 | 287 | if minValue <= dateValue and maxValue >= dateValue : 288 | if month > 0 and month < 13 and day > 0 : 289 | dayLimit = self.__getLunarDays(year, month, isIntercalation) if isLunar else self.__getSolarDays(year, month) 290 | if isLunar == False and year == 1582 and month == 10 : 291 | if day > 4 and day < 15 : 292 | return isValid 293 | else: 294 | dayLimit += 10 295 | 296 | if day <= dayLimit : 297 | isValid = True 298 | 299 | return isValid 300 | 301 | def setLunarDate(self, lunarYear, lunarMonth, lunarDay, isIntercalation) : 302 | isValid = False 303 | if self.__checkValidDate(True, isIntercalation, lunarYear, lunarMonth, lunarDay): 304 | self.lunarYear = lunarYear 305 | self.lunarMonth = lunarMonth 306 | self.lunarDay = lunarDay 307 | self.isIntercalation = isIntercalation and (self.__getLunarIntercalationMonth(self.__getLunarData(lunarYear)) == lunarMonth) 308 | self.__setSolarDateByLunarDate(lunarYear, lunarMonth, lunarDay, isIntercalation) 309 | isValid = True 310 | return isValid 311 | 312 | def setSolarDate(self, solarYear, solarMonth, solarDay): 313 | isValid = False 314 | if self.__checkValidDate(False, False, solarYear, solarMonth, solarDay) : 315 | self.solarYear = solarYear 316 | self.solarMonth = solarMonth 317 | self.solarDay = solarDay 318 | self.__setLunarDateBySolarDate(solarYear, solarMonth, solarDay) 319 | isValid = True 320 | return isValid 321 | 322 | def __getGapJa(self): 323 | absDays = self.__getLunarAbsDays(self.lunarYear, self.lunarMonth, self.lunarDay, self.isIntercalation) 324 | if absDays > 0 : 325 | self.__gapjaYearInx[0] = ((self.lunarYear + 6) - self.KOREAN_LUNAR_BASE_YEAR) % len(self.KOREAN_CHEONGAN) 326 | self.__gapjaYearInx[1] = ((self.lunarYear + 0) - self.KOREAN_LUNAR_BASE_YEAR) % len(self.KOREAN_GANJI) 327 | 328 | monthCount = self.lunarMonth 329 | monthCount += 12 * (self.lunarYear - self.KOREAN_LUNAR_BASE_YEAR) 330 | self.__gapjaMonthInx[0] = (monthCount + 3) % len(self.KOREAN_CHEONGAN) 331 | self.__gapjaMonthInx[1] = (monthCount + 1) % len(self.KOREAN_GANJI) 332 | 333 | self.__gapjaDayInx[0] = (absDays + 4) % len(self.KOREAN_CHEONGAN) 334 | self.__gapjaDayInx[1] = (absDays + 2) % len(self.KOREAN_GANJI) 335 | 336 | def getGapJaString(self) : 337 | self.__getGapJa() 338 | gapjaStr = "%c%c%c %c%c%c %c%c%c" % (chr(self.KOREAN_CHEONGAN[self.__gapjaYearInx[0]]), chr(self.KOREAN_GANJI[self.__gapjaYearInx[1]]), chr(self.KOREAN_GAPJA_UNIT[self.__gapjaYearInx[2]]), 339 | chr(self.KOREAN_CHEONGAN[self.__gapjaMonthInx[0]]), chr(self.KOREAN_GANJI[self.__gapjaMonthInx[1]]), chr(self.KOREAN_GAPJA_UNIT[self.__gapjaMonthInx[2]]), 340 | chr(self.KOREAN_CHEONGAN[self.__gapjaDayInx[0]]), chr(self.KOREAN_GANJI[self.__gapjaDayInx[1]]), chr(self.KOREAN_GAPJA_UNIT[self.__gapjaDayInx[2]])) 341 | 342 | if self.isIntercalation == True : 343 | gapjaStr += " (%c%c)" % (chr(self.INTERCALATION_STR[0]), chr(self.KOREAN_GAPJA_UNIT[1])) 344 | return gapjaStr 345 | 346 | 347 | def getChineseGapJaString(self) : 348 | self.__getGapJa() 349 | gapjaStr = "%c%c%c %c%c%c %c%c%c" % (chr(self.CHINESE_CHEONGAN[self.__gapjaYearInx[0]]), chr(self.CHINESE_GANJI[self.__gapjaYearInx[1]]), chr(self.CHINESE_GAPJA_UNIT[self.__gapjaYearInx[2]]), 350 | chr(self.CHINESE_CHEONGAN[self.__gapjaMonthInx[0]]), chr(self.CHINESE_GANJI[self.__gapjaMonthInx[1]]), chr(self.CHINESE_GAPJA_UNIT[self.__gapjaMonthInx[2]]), 351 | chr(self.CHINESE_CHEONGAN[self.__gapjaDayInx[0]]), chr(self.CHINESE_GANJI[self.__gapjaDayInx[1]]), chr(self.CHINESE_GAPJA_UNIT[self.__gapjaDayInx[2]])) 352 | 353 | if self.isIntercalation == True : 354 | gapjaStr += " (%c%c)" % (chr(self.INTERCALATION_STR[1]), chr(self.CHINESE_GAPJA_UNIT[1])) 355 | return gapjaStr 356 | --------------------------------------------------------------------------------