mm-cal-js
Version:
Myanmar calendar calculation library
1 lines • 20.5 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../src/mm-calendar/western-to-julian.ts","../src/mm-calendar/constants.ts","../src/mm-calendar/julian-to-myanmar.ts","../src/mm-calendar/myanmar-year-constants.ts","../src/mm-calendar/myanmar-date.ts","../src/mm-calendar/astro.ts"],"sourcesContent":["import { GREGORIAN_START_IN_ENGLISH_CAL } from \"./constants\";\n\nexport enum CalendarType {\n English = 0,\n Gregorian = 1,\n Julian = 2,\n}\n\n/**\n * Western date ot Julian day number. Credit4 Gregorian 2 JD: (w2j)\n * @see https://cool-emerald.blogspot.com/2013/06/algorithm-program-and-calculation-of.html#jdn\n * @param date western date object\n * @param startOfGregorian start of Gregorian calendar in Julian day number (default 2361222)\n * @param calendarType calendar type (default English)\n * @returns Julian day number\n */\n\nexport const westernToJulianDayNumber = (\n date: Date,\n startOfGregorian = GREGORIAN_START_IN_ENGLISH_CAL,\n calendarType = CalendarType.English\n): number => {\n // stupid JavaScript month is zero-based\n let oneBasedMonth = date.getMonth() + 1;\n let a = Math.floor((14 - oneBasedMonth) / 12);\n let year = date.getFullYear() + 4800 - a;\n let month = oneBasedMonth + 12 * a - 3;\n // Gregorian calendar starts in English calendar on 14 September 1752\n startOfGregorian =\n startOfGregorian <= 0 ? GREGORIAN_START_IN_ENGLISH_CAL : startOfGregorian;\n\n let julianDay =\n date.getDate() +\n Math.floor((153 * month + 2) / 5.0) +\n 365 * year +\n Math.floor(year / 4.0);\n if (calendarType === CalendarType.Gregorian) {\n julianDay =\n julianDay - Math.floor(year / 100.0) + Math.floor(year / 400.0) - 32045;\n } else if (calendarType === CalendarType.Julian) {\n julianDay = julianDay - 32083;\n } else {\n julianDay =\n julianDay - Math.floor(year / 100.0) + Math.floor(year / 400.0) - 32045;\n if (julianDay < startOfGregorian) {\n julianDay =\n date.getDate() +\n Math.floor((153 * month + 2) / 5.0) +\n (365 * year )+\n Math.floor(year / 4.0) -\n 32083;\n if (julianDay > startOfGregorian) {\n julianDay = startOfGregorian;\n }\n }\n }\n let fraction = getFractionOfDay(date);\n return julianDay + fraction;\n};\n\nconst getFractionOfDay = (date: Date) => {\n return (\n (date.getHours() - 12) / 24 +\n date.getMinutes() / 1440 +\n date.getSeconds() / 86400\n );\n};\n","/**\n * The original variable names are shown in the comments.\n * https://github.com/chanmratekoko/mmcalendar/blob/master/src/main/java/mmcalendar/Constants.java\n */\n\n/**\n * SY\n * solar year (365.2587565) (1577917828 / 4320000.0)\n */\nexport const SOLAR_YEAR = 365.2587564814815;\n\n/**\n * LM\n * lunar month (29.53058795) (1577917828 / 53433336.0)\n */\n\nexport const LUNAR_MONTH = 29.53058794607172;\n\n/**\n * MO\n * beginning of 0 ME\n * Starting year of Myanmar era (year 0)\n */\nexport const MYANMAR_ERA_START = 1954168.050623;\n\n/**\n * SE3\n * beginning of 3rd era\n */\nexport const THIRD_ERA_START = 1312;\n\n/**\n * BY\n * Beginning of English Calendar\n */\nexport const ENGLISH_CAL_START = 640;\n\n/**\n * EY\n * End of English Calendar\n */\nexport const ENGLISH_CAL_END = 2140;\n\n/**\n * MBY\n * Beginning of Myanmar Calendar\n */\nexport const MYANMAR_CAL_START = 2;\n\n/**\n * MEY\n * End of Myanmar Calendar\n */\nexport const MYANMAR_CAL_END = 1500;\n\n/**\n * LT\n * Minimum accurate English year\n */\nexport const MINIMUM_ACCURATE_ENGLISH_YEAR = 1700;\n\n/**\n * UT\n * Maximum accurate English year\n */\nexport const MAXIMUM_ACCURATE_ENGLISH_YEAR = 2018;\n\n/**\n * MLT\n * Minimum accurate Myanmar year\n */\nexport const MINIMUM_ACCURATE_MYANMAR_YEAR = 1062;\n\n/**\n * MUT\n * Maximum accurate Myanmar year\n */\nexport const MAXIMUM_ACCURATE_MYANMAR_YEAR = 1379;\n\n/**\n * SG\n * Gregorian start in English calendar (1752/Sep/14)\n */\nexport const GREGORIAN_START_IN_ENGLISH_CAL = 2361222;\n\n/**\n * EMA\n * Myanmar month names\n */\nexport const MYANMAR_MONTHS: string[] = [\n \"First Waso\",\n \"Tagu\",\n \"Kason\",\n \"Nayon\",\n \"Waso\",\n \"Wagaung\",\n \"Tawthalin\",\n \"Thadingyut\",\n \"Tazaungmon\",\n \"Nadaw\",\n \"Pyatho\",\n \"Tabodwe\",\n \"Tabaung\",\n \"Late Tagu\",\n \"Late Kason\",\n];\n\n/**\n * MSA\n * New Moon means Dark moon\n */\nexport const MOON_PHASES: string[] = [\n \"Waxing\",\n \"Full Moon\",\n \"Waning\",\n \"New Moon\",\n];\n\n/**\n * WDA\n * Week Days\n */\nexport const WEEK_DAYS: string[] = [\n \"Saturday\",\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n];\n","import { LUNAR_MONTH, MYANMAR_ERA_START, SOLAR_YEAR } from \"./constants\";\nimport { getMyanmarConstants } from \"./myanmar-year-constants\";\n\n/**\n * Julian day number to Myanmar date\n * @param julianDay : julian day number\n * @returns myanmarYearType = year type [0=common, 1=little watat, 2=big watat]\n * @returns month = [\n * Tagu=1, Kason=2, Nayon=3, 1st Waso=0, 2nd Waso=4,\n * Wagaung=5, Tawthalin=6, Thadingyut=7, Tazaungmon=8,\n * Nadaw=9, Pyatho=10, Tabodwe=11, Tabaung=12,\n * Late Tagu=13, Late Kason=14]\n * @returns monthType = [0=Hnaung, 1=Oo]\n * @returns monthLength = [29 or 30 days]\n * @returns monthDay = [1 to 30]\n * @returns fortnightDay = [1 to 15]\n * @returns moonPhase = [0=waxing, 1=full moon, 2=waning, 3=new moon]\n * @returns weekDay = [0=sat, 1=sun, 2=mon, 3=tue, 4=wed, 5=thu, 6=fri]\n */\nexport const julianToMyanmarDate = (julianDay: number) => {\n // convert jd to jdn\n // jdn\n let julianDayNumber = Math.round(julianDay);\n // myear\n let myanmarYear = Math.floor(\n (julianDayNumber - 0.5 - MYANMAR_ERA_START) / SOLAR_YEAR\n );\n // check year\n let yo = checkMyanmarYear(myanmarYear);\n // dd\n let dayCount = julianDayNumber - yo.tagu1 + 1;\n let b =Math.floor( yo.myanmarYearType / 2);\n // big wa and common year\n let c = Math.floor(1 / (yo.myanmarYearType + 1));\n // year length\n let yearLength = 354 + (1 - c) * 30 + b;\n // month type: Hnaung = 1 or Oo = 0 | late = 1 or early = 0\n let monthType = Math.floor((dayCount -1)/yearLength);\n dayCount -= monthType * yearLength;\n // adjust day count and threshold\n let a = Math.floor((dayCount + 423) / 512);\n // month\n let month = Math.floor((dayCount - b * a + c * a * 30 + 29.26) / 29.544);\n let e =Math.floor( (month + 12) / 16);\n let f = Math.floor((month + 11) / 16);\n // day of month\n let monthDay =\n dayCount - Math.floor(29.544 * month - 29.26) - b * e + c * f * 30;\n \n // adjust month numbers for late months\n month += f * 3 - e * 4 + 12 * monthType;\n let monthLength = 30 - (month % 2);\n\n if (month === 3) {\n // adjust if Nayon in big watat\n monthLength += yo.myanmarYearType / 2;\n }\n // moon phase from day of the month, month, and year type\n // [0=waxing, 1=full moon, 2=waning, 3=new moon]\n let moonPhase = (monthDay + 1) / 16 + monthDay / 16 + monthDay / monthLength;\n\n // fortnight day from month day\n // waxing or waning day\n let fortnightDay = monthDay - 15 * (monthDay / 16);\n // week day\n let weekDay = (julianDayNumber + 2) % 7;\n return {\n myanmarYear,\n myanmarYearType: yo.myanmarYearType,\n yearLength,\n month,\n monthType,\n monthLength,\n monthDay,\n // moonPhase,\n // fortnightDay,\n weekDay,\n julianDay,\n };\n};\n\n/**\n * Check watat (intercalary month) (chk_watat)\n * @param myanmarYear Myanmar year\n * @returns watat = intercalary month [1=watat, 0=common]\n * @returns fm = full moon day of 2nd Waso in jdn_mm (jdn+6.5 for MMT) [only valid when watat=1]\n */\nexport const checkWatat = (myanmarYear: number) => {\n // get constants for the corresponding calendar era\n let myanmarConstants = getMyanmarConstants(myanmarYear);\n // threshold to adjust\n let threshold =\n (SOLAR_YEAR / 12 - LUNAR_MONTH) * (12 - myanmarConstants.NUMBER_OF_MONTHS);\n // excess day\n let excessDays = (SOLAR_YEAR * (myanmarYear + 3739)) % LUNAR_MONTH;\n\n if (excessDays < threshold) {\n // adjust excess days\n excessDays += LUNAR_MONTH;\n }\n // full moon day of 2nd Waso\n let fullMoon = Math.round(\n SOLAR_YEAR * myanmarYear +\n MYANMAR_ERA_START -\n excessDays +\n 4.5 * LUNAR_MONTH +\n myanmarConstants.WATAT_OFFSET\n );\n let watat = 0;\n // find watat\n if (myanmarConstants.ERA_ID >= 2) {\n // if 2nd era or later, find watat based on excess days\n let tw =\n LUNAR_MONTH -\n (SOLAR_YEAR / 12 - LUNAR_MONTH) * myanmarConstants.NUMBER_OF_MONTHS;\n if (excessDays >= tw) {\n watat = 1;\n }\n } else {\n // if 1st era, find watat by 19 years metonic cycle\n // Myanmar year is divided by 19 and there is an intercalary month\n // if the remainder is 2, 5, 7, 10, 13, 15, 18\n // https://github.com/kanasimi/CeJS/blob/master/data/date/calendar.js#L2330\n watat = (myanmarYear * 7 + 2) % 19;\n if (watat < 0) {\n watat += 19;\n }\n watat = Math.floor(watat / 12.0);\n }\n // correct watat exceptions\n watat ^= myanmarConstants.EXCEPTION_IN_WATAT_YEAR;\n return {\n fullMoon, // fm\n watat, // watat\n };\n};\n\n/**\n * Check Myanamr year (chk_my)\n * depenency: chk_watat(my)\n * @param myanmarYear Myanmar year\n * @returns map\n * myanmarYearType = year type [0=common, 1=little watat, 2=big watat] (myt)\n * tagu1 = the 1st day of Tagu as Julian Day Number (Julian Day Number for MMT) tg1\n * fullMoon = full moon day of [2nd] Waso as Julian Day Number (fm)\n * watatError = [0=ok, 1=error] (werr)\n */\nexport const checkMyanmarYear = (myanmarYear: number) => {\n let y2 = checkWatat(myanmarYear);\n let myanmarYearType = y2!.watat;\n\n let yd = 0;\n let y1:\n | {\n fullMoon: number;\n watat: number;\n }\n | undefined = undefined;\n\n do {\n yd++;\n y1 = checkWatat(myanmarYear - yd);\n } while (y1!.watat === 0 && yd < 3);\n\n let fullMoon: number = 0;\n let watatError = 0;\n\n if (myanmarYearType) {\n let nd = (y2!.fullMoon - y1!.fullMoon) % 354;\n myanmarYearType = Math.floor(nd / 31) + 1;\n fullMoon = y2!.fullMoon;\n if (nd != 30 && nd != 31) {\n watatError = 1;\n }\n } else {\n fullMoon = y1!.fullMoon + 354 * yd;\n\n }\n\n let tagu1 = y1!.fullMoon + 354 * yd - 102;\n return {\n myanmarYearType, // myt\n tagu1, // tg1\n fullMoon: fullMoon, // fm\n watatError, // werr\n };\n};\n","/**\n * Get Myanmar year constants depending on era\n * @param myanmarYear Myanmar year\n * @returns map\n * ERA_ID = Myanmar calendar era id [1-3] (EI)\n * WATAT_OFFSET = watat offset to compensate (WO)\n * NUMBER_OF_MONTHS = number of months to find excess days (NM)\n * EXCEPTION_IN_WATAT_YEAR = exception in watat year (EW)\n */\nexport const getMyanmarConstants = (myanmarYear: number) => {\n let eraId: number;\n let watatOffset: number;\n let numberOfMonths: number;\n let exceptionInWatatYear = 0;\n let fullmoonExceptions: number[][];\n let watatExceptions: number[];\n let i: number;\n\n // the third era (the era after Independence 1312 ME and after)\n if (myanmarYear > 1312) {\n eraId = 3;\n watatOffset = -0.5;\n numberOfMonths = 8;\n fullmoonExceptions = [[1377, 1]];\n watatExceptions = [1344, 1345];\n }\n // The second era (the era under British colony: 1217 ME to 1311 ME)\n else if (myanmarYear >= 1217) {\n eraId = 2;\n watatOffset = -1;\n numberOfMonths = 4;\n fullmoonExceptions = [\n [1234, 1],\n [1261, -1],\n ];\n watatExceptions = [1263, 1264];\n }\n // The first era (the era of Myanmar kings: 1216 ME and before)\n // Thandeikta (ME 1100 - 1216)\n else if (myanmarYear >= 1100) {\n eraId = 1.3;\n watatOffset = -0.85;\n numberOfMonths = -1;\n fullmoonExceptions = [\n [1120, 1],\n [1126, -1],\n [1150, 1],\n [1172, -1],\n [1207, 1],\n ];\n watatExceptions = [1201, 1202];\n }\n // Makaranta system 2 (ME 798 - 1099)\n else if (myanmarYear >= 798) {\n eraId = 1.2;\n watatOffset = -1.1;\n numberOfMonths = -1;\n fullmoonExceptions = [\n [813, -1],\n [849, -1],\n [851, -1],\n [854, -1],\n [927, -1],\n [933, -1],\n [936, -1],\n [938, -1],\n [949, -1],\n [952, -1],\n [963, -1],\n [968, -1],\n [1039, -1],\n ];\n watatExceptions = [];\n }\n // Makaranta system 1 (ME 0 - 797)\n else {\n eraId = 1.1;\n watatOffset = -1.1;\n numberOfMonths = -1;\n fullmoonExceptions = [\n [205, 1],\n [246, 1],\n [471, 1],\n [572, -1],\n [651, 1],\n [653, 2],\n [656, 1],\n [672, 1],\n [729, 1],\n [767, -1],\n ];\n watatExceptions = [];\n }\n i = bSearch2(myanmarYear, fullmoonExceptions);\n if (i >= 0) {\n // full moon day offset exceptions\n watatOffset += fullmoonExceptions[i][1];\n }\n i = bSearch1(myanmarYear, watatExceptions);\n if (i >= 0) {\n // correct watat exceptions\n exceptionInWatatYear = 1;\n }\n return {\n ERA_ID: eraId, // EI\n WATAT_OFFSET: watatOffset, // WO\n NUMBER_OF_MONTHS: numberOfMonths, // NM\n EXCEPTION_IN_WATAT_YEAR: exceptionInWatatYear, // EW\n };\n};\n\n// Binary search for array with two elements\nconst bSearch2 = (key: number, arr: number[][]) => {\n let i = 0;\n let l = 0;\n let u = arr.length - 1;\n while (u >= l) {\n i = Math.floor((l + u) / 2);\n if (arr[i][0] > key) u = i - 1;\n else if (arr[i][0] < key) l = i + 1;\n else return i;\n }\n return -1;\n};\n\nconst bSearch1 = (key: number, arr: number[]) => {\n let i = 0;\n let l = 0;\n let u = arr.length - 1;\n while (u >= l) {\n i = Math.floor((l + u) / 2);\n if (arr[i] > key) u = i - 1;\n else if (arr[i] < key) l = i + 1;\n else return i;\n }\n return -1;\n};\n","import { julianToMyanmarDate } from \"./julian-to-myanmar\";\nimport { westernToJulianDayNumber } from \"./western-to-julian\";\n\nexport const getMyanmarDate = (date: Date) => {\n return julianToMyanmarDate(westernToJulianDayNumber(date));\n};\n","import { getMyanmarDate } from \"./myanmar-date\";\n\n/**\n * Checking Astrological days\n * More details @ http://cool-emerald.blogspot.sg/2013/12/myanmar-astrological-calendar-days.html\n * Get sabbath day and sabbath eve from JS date object.\n * The API deviates from the original implementation. But, should output the same result.\n * @param date JS date object\n * @returns [1=sabbath, 2=sabbath eve, 0=else]\n */\nexport const isSabbath = (date: Date) => {\n const { monthLength, monthDay, myanmarYearType } = getMyanmarDate(date);\n let isSabbath = 0;\n if (\n monthDay === 8 ||\n monthDay === 15 ||\n monthDay === 23 ||\n monthDay === monthLength\n ) {\n isSabbath = 1;\n }\n if (\n monthDay === 7 ||\n monthDay === 14 ||\n monthDay === 22 ||\n monthDay === monthLength - 1\n ) {\n isSabbath = 2;\n }\n return isSabbath;\n};\n"],"names":["CalendarType","SOLAR_YEAR","LUNAR_MONTH","MYANMAR_ERA_START","GREGORIAN_START_IN_ENGLISH_CAL","julianToMyanmarDate","julianDay","julianDayNumber","Math","round","myanmarYear","floor","yo","checkMyanmarYear","dayCount","tagu1","b","myanmarYearType","c","yearLength","monthType","a","month","e","f","monthDay","monthLength","weekDay","checkWatat","myanmarConstants","eraId","watatOffset","numberOfMonths","fullmoonExceptions","watatExceptions","i","exceptionInWatatYear","key","arr","l","u","length","bSearch2","bSearch1","ERA_ID","WATAT_OFFSET","NUMBER_OF_MONTHS","EXCEPTION_IN_WATAT_YEAR","getMyanmarConstants","excessDays","fullMoon","watat","y2","yd","y1","undefined","watatError","nd","westernToJulianDayNumber","date","startOfGregorian","calendarType","English","oneBasedMonth","getMonth","year","getFullYear","getDate","Gregorian","Julian","getFractionOfDay","getHours","getMinutes","getSeconds","getMyanmarDate","_getMyanmarDate","isSabbath"],"mappings":"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"}