UNPKG

@ng-bootstrap/ng-bootstrap

Version:
122 lines 15.8 kB
import { NgbDate } from '../ngb-date'; const JD_EPOCH = 1724220.5; const DAYSPERMONTH = [30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 5]; /** * Determine whether this date is in a leap year. * * `year` is the year to examine * returns boolean - true if this is a leap year, false if not * */ export function isEthiopianLeapYear(year) { if (year != null) { return year % 4 == 3 || year % 4 == -1; } return false; } /** * Sets the Ethiopian year. * * `date` is Ethiopian date * * `yearValue` incremented year * returns NgbDate - ethiopian date * */ export function setEthiopianYear(date, yearValue) { date.year = +yearValue; return date; } /** * Sets the Ethiopian month. * * `date` is Ethiopian date * * `val` incremented month * returns NgbDate - Ethiopian date * */ export function setEthiopianMonth(date, val) { val = +val; date.year = date.year + Math.floor((val - 1) / 13); date.month = Math.floor((((val - 1) % 13) + 13) % 13) + 1; return date; } /** * Sets the Ethiopian day. * * `date` is Ethiopian date * * `day` incremented day * returns NgbDate - Ethiopian date * */ export function setEthiopianDay(date, day) { let mDays = getDaysPerMonth(date.month, date.year); if (day <= 0) { while (day <= 0) { date = setEthiopianMonth(date, date.month - 1); mDays = getDaysPerMonth(date.month, date.year); day += mDays; } } else if (day > mDays) { while (day > mDays) { day -= mDays; date = setEthiopianMonth(date, date.month + 1); mDays = getDaysPerMonth(date.month, date.year); } } date.day = day; return date; } function getDaysPerMonth(month, year) { let leapYear = isEthiopianLeapYear(year); return DAYSPERMONTH[month - 1] + (month === 13 && leapYear ? 1 : 0); } export function toGregorian(ethiopianDate) { let jdn = ethiopianToJulian(ethiopianDate.year, ethiopianDate.month, ethiopianDate.day); let date = julianToGregorian(jdn); date.setHours(6, 30, 3, 200); return date; } export function fromGregorian(gdate) { let g2d = gregorianToJulian(gdate.getFullYear(), gdate.getMonth() + 1, gdate.getDate()); return juilianToEthiopia(g2d); } export function ethiopianToJulian(year, month, day) { if (year < 0) { year++; } // No year zero return day + (month - 1) * 30 + (year - 1) * 365 + Math.floor(year / 4) + JD_EPOCH - 1; } function juilianToEthiopia(jd) { let c = Math.floor(jd) + 0.5 - JD_EPOCH; let year = Math.floor((c - Math.floor((c + 366) / 1461)) / 365) + 1; if (year <= 0) { year--; } // No year zero c = Math.floor(jd) + 0.5 - ethiopianToJulian(year, 1, 1); let month = Math.floor(c / 30) + 1; let day = c - (month - 1) * 30 + 1; return new NgbDate(year, month, day); } function julianToGregorian(jd) { let z = Math.floor(jd + 0.5); let a = Math.floor((z - 1867216.25) / 36524.25); a = z + 1 + a - Math.floor(a / 4); let b = a + 1524; let c = Math.floor((b - 122.1) / 365.25); let d = Math.floor(365.25 * c); let e = Math.floor((b - d) / 30.6001); let day = b - d - Math.floor(e * 30.6001); let month = e - (e > 13.5 ? 13 : 1); let year = c - (month > 2.5 ? 4716 : 4715); if (year <= 0) { year--; } // No year zero return new Date(year, month, day); } export function gregorianToJulian(year, month, day) { if (year < 0) { year++; } // No year zero // Jean Meeus algorithm, "Astronomical Algorithms", 1991 if (month < 3) { month += 12; year--; } let a = Math.floor(year / 100); let b = 2 - a + Math.floor(a / 4); return Math.floor(365.25 * (year + 4716)) + Math.floor(30.6001 * (month + 1)) + day + b - 1524.5; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXRoaW9waWFuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RhdGVwaWNrZXIvZXRoaW9waWFuL2V0aGlvcGlhbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQztBQUMzQixNQUFNLFlBQVksR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRXpFOzs7O0tBSUs7QUFFTCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsSUFBWTtJQUMvQyxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7UUFDakIsT0FBTyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQ3ZDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7O0tBS0s7QUFFTCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBYSxFQUFFLFNBQWlCO0lBQ2hFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7O0tBS0s7QUFDTCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBYSxFQUFFLEdBQVc7SUFDM0QsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDO0lBQ1gsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDbkQsSUFBSSxD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RCxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7UUFDZCxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxFQUFFLENBQUM7S0FDUDtJQUNELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDbEcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nYkRhdGUgfSBmcm9tICcuLi9uZ2ItZGF0ZSc7XG5cbmNvbnN0IEpEX0VQT0NIID0gMTcyNDIyMC41O1xuY29uc3QgREFZU1BFUk1PTlRIID0gWzMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDVdO1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIHRoaXMgZGF0ZSBpcyBpbiBhIGxlYXAgeWVhci5cbiAqICogYHllYXJgIGlzIHRoZSB5ZWFyIHRvIGV4YW1pbmVcbiAqIHJldHVybnMgYm9vbGVhbiAtIHRydWUgaWYgdGhpcyBpcyBhIGxlYXAgeWVhciwgZmFsc2UgaWYgbm90XG4gKiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaXNFdGhpb3BpYW5MZWFwWWVhcih5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcblx0aWYgKHllYXIgIT0gbnVsbCkge1xuXHRcdHJldHVybiB5ZWFyICUgNCA9PSAzIHx8IHllYXIgJSA0ID09IC0xO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBFdGhpb3BpYW4geWVhci5cbiAqICogYGRhdGVgIGlzIEV0aGlvcGlhbiBkYXRlXG4gKiAqIGB5ZWFyVmFsdWVgIGluY3JlbWVudGVkIHllYXJcbiAqIHJldHVybnMgTmdiRGF0ZSAtIGV0aGlvcGlhbiBkYXRlXG4gKiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0RXRoaW9waWFuWWVhcihkYXRlOiBOZ2JEYXRlLCB5ZWFyVmFsdWU6IG51bWJlcik6IE5nYkRhdGUge1xuXHRkYXRlLnllYXIgPSAreWVhclZhbHVlO1xuXHRyZXR1cm4gZGF0ZTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBFdGhpb3BpYW4gbW9udGguXG4gKiAqIGBkYXRlYCBpcyBFdGhpb3BpYW4gZGF0ZVxuICogKiBgdmFsYCBpbmNyZW1lbnRlZCBtb250aFxuICogcmV0dXJucyBOZ2JEYXRlIC0gRXRoaW9waWFuIGRhdGVcbiAqICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RXRoaW9waWFuTW9udGgoZGF0ZTogTmdiRGF0ZSwgdmFsOiBudW1iZXIpOiBOZ2JEYXRlIHtcblx0dmFsID0gK3ZhbDtcblx0ZGF0ZS55ZWFyID0gZGF0ZS55ZWFyICsgTWF0aC5mbG9vcigodmFsIC0gMSkgLyAxMyk7XG5cdGRhdGUubW9udGggPSBNYXRoLmZsb29yKCgoKHZhbCAtIDEpICUgMTMpICsgMTMpICUgMTMpICsgMTtcblx0cmV0dXJuIGRhdGU7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgRXRoaW9waWFuIGRheS5cbiAqICogYGRhdGVgIGlzIEV0aGlvcGlhbiBkYXRlXG4gKiAqIGBkYXlgIGluY3JlbWVudGVkIGRheVxuICogcmV0dXJucyBOZ2JEYXRlIC0gRXRoaW9waWFuIGRhdGVcbiAqICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RXRoaW9waWFuRGF5KGRhdGU6IE5nYkRhdGUsIGRheTogbnVtYmVyKTogTmdiRGF0ZSB7XG5cdGxldCBtRGF5cyA9IGdldERheXNQZXJNb250aChkYXRlLm1vbnRoLCBkYXRlLnllYXIpO1xuXHRpZiAoZGF5IDw9IDApIHtcblx0XHR3aGlsZSAoZGF5IDw9IDApIHtcblx0XHRcdGRhdGUgPSBzZXRFdGhpb3BpYW5Nb250aChkYXRlLCBkYXRlLm1vbnRoIC0gMSk7XG5cdFx0XHRtRGF5cyA9IGdldERheXNQZXJNb250aChkYXRlLm1vbnRoLCBkYXRlLnllYXIpO1xuXHRcdFx0ZGF5ICs9IG1EYXlzO1xuXHRcdH1cblx0fSBlbHNlIGlmIChkYXkgPiBtRGF5cykge1xuXHRcdHdoaWxlIChkYXkgPiBtRGF5cykge1xuXHRcdFx0ZGF5IC09IG1EYXlzO1xuXHRcdFx0ZGF0ZSA9IHNldEV0aGlvcGlhbk1vbnRoKGRhdGUsIGRhdGUubW9udGggKyAxKTtcblx0XHRcdG1EYXlzID0gZ2V0RGF5c1Blck1vbnRoKGRhdGUubW9udGgsIGRhdGUueWVhcik7XG5cdFx0fVxuXHR9XG5cdGRhdGUuZGF5ID0gZGF5O1xuXHRyZXR1cm4gZGF0ZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGF5c1Blck1vbnRoKG1vbnRoOiBudW1iZXIsIHllYXI6IG51bWJlcik6IG51bWJlciB7XG5cdGxldCBsZWFwWWVhciA9IGlzRXRoaW9waWFuTGVhcFllYXIoeWVhcik7XG5cdHJldHVybiBEQVlTUEVSTU9OVEhbbW9udGggLSAxXSArIChtb250aCA9PT0gMTMgJiYgbGVhcFllYXIgPyAxIDogMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0dyZWdvcmlhbihldGhpb3BpYW5EYXRlOiBOZ2JEYXRlKTogRGF0ZSB7XG5cdGxldCBqZG4gPSBldGhpb3BpYW5Ub0p1bGlhbihldGhpb3BpYW5EYXRlLnllYXIsIGV0aGlvcGlhbkRhdGUubW9udGgsIGV0aGlvcGlhbkRhdGUuZGF5KTtcblx0bGV0IGRhdGUgPSBqdWxpYW5Ub0dyZWdvcmlhbihqZG4pO1xuXHRkYXRlLnNldEhvdXJzKDYsIDMwLCAzLCAyMDApO1xuXHRyZXR1cm4gZGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21HcmVnb3JpYW4oZ2RhdGU6IERhdGUpOiBOZ2JEYXRlIHtcblx0bGV0IGcyZCA9IGdyZWdvcmlhblRvSnVsaWFuKGdkYXRlLmdldEZ1bGxZZWFyKCksIGdkYXRlLmdldE1vbnRoKCkgKyAxLCBnZGF0ZS5nZXREYXRlKCkpO1xuXHRyZXR1cm4ganVpbGlhblRvRXRoaW9waWEoZzJkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV0aGlvcGlhblRvSnVsaWFuKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF5OiBudW1iZXIpIHtcblx0aWYgKHllYXIgPCAwKSB7XG5cdFx0eWVhcisrO1xuXHR9IC8vIE5vIHllYXIgemVyb1xuXHRyZXR1cm4gZGF5ICsgKG1vbnRoIC0gMSkgKiAzMCArICh5ZWFyIC0gMSkgKiAzNjUgKyBNYXRoLmZsb29yKHllYXIgLyA0KSArIEpEX0VQT0NIIC0gMTtcbn1cblxuZnVuY3Rpb24ganVpbGlhblRvRXRoaW9waWEoamQ6IG51bWJlcikge1xuXHRsZXQgYyA9IE1hdGguZmxvb3IoamQpICsgMC41IC0gSkRfRVBPQ0g7XG5cdGxldCB5ZWFyID0gTWF0aC5mbG9vcigoYyAtIE1hdGguZmxvb3IoKGMgKyAzNjYpIC8gMTQ2MSkpIC8gMzY1KSArIDE7XG5cdGlmICh5ZWFyIDw9IDApIHtcblx0XHR5ZWFyLS07XG5cdH0gLy8gTm8geWVhciB6ZXJvXG5cdGMgPSBNYXRoLmZsb29yKGpkKSArIDAuNSAtIGV0aGlvcGlhblRvSnVsaWFuKHllYXIsIDEsIDEpO1xuXHRsZXQgbW9udGggPSBNYXRoLmZsb29yKGMgLyAzMCkgKyAxO1xuXHRsZXQgZGF5ID0gYyAtIChtb250aCAtIDEpICogMzAgKyAxO1xuXHRyZXR1cm4gbmV3IE5nYkRhdGUoeWVhciwgbW9udGgsIGRheSk7XG59XG5cbmZ1bmN0aW9uIGp1bGlhblRvR3JlZ29yaWFuKGpkOiBudW1iZXIpIHtcblx0bGV0IHogPSBNYXRoLmZsb29yKGpkICsgMC41KTtcblx0bGV0IGEgPSBNYXRoLmZsb29yKCh6IC0gMTg2NzIxNi4yNSkgLyAzNjUyNC4yNSk7XG5cdGEgPSB6ICsgMSArIGEgLSBNYXRoLmZsb29yKGEgLyA0KTtcblx0bGV0IGIgPSBhICsgMTUyNDtcblx0bGV0IGMgPSBNYXRoLmZsb29yKChiIC0gMTIyLjEpIC8gMzY1LjI1KTtcblx0bGV0IGQgPSBNYXRoLmZsb29yKDM2NS4yNSAqIGMpO1xuXHRsZXQgZSA9IE1hdGguZmxvb3IoKGIgLSBkKSAvIDMwLjYwMDEpO1xuXHRsZXQgZGF5ID0gYiAtIGQgLSBNYXRoLmZsb29yKGUgKiAzMC42MDAxKTtcblx0bGV0IG1vbnRoID0gZSAtIChlID4gMTMuNSA/IDEzIDogMSk7XG5cdGxldCB5ZWFyID0gYyAtIChtb250aCA+IDIuNSA/IDQ3MTYgOiA0NzE1KTtcblx0aWYgKHllYXIgPD0gMCkge1xuXHRcdHllYXItLTtcblx0fSAvLyBObyB5ZWFyIHplcm9cblx0cmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ3JlZ29yaWFuVG9KdWxpYW4oeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyLCBkYXk6IG51bWJlcikge1xuXHRpZiAoeWVhciA8IDApIHtcblx0XHR5ZWFyKys7XG5cdH0gLy8gTm8geWVhciB6ZXJvXG5cdC8vIEplYW4gTWVldXMgYWxnb3JpdGhtLCBcIkFzdHJvbm9taWNhbCBBbGdvcml0aG1zXCIsIDE5OTFcblx0aWYgKG1vbnRoIDwgMykge1xuXHRcdG1vbnRoICs9IDEyO1xuXHRcdHllYXItLTtcblx0fVxuXHRsZXQgYSA9IE1hdGguZmxvb3IoeWVhciAvIDEwMCk7XG5cdGxldCBiID0gMiAtIGEgKyBNYXRoLmZsb29yKGEgLyA0KTtcblx0cmV0dXJuIE1hdGguZmxvb3IoMzY1LjI1ICogKHllYXIgKyA0NzE2KSkgKyBNYXRoLmZsb29yKDMwLjYwMDEgKiAobW9udGggKyAxKSkgKyBkYXkgKyBiIC0gMTUyNC41O1xufVxuIl19