UNPKG

ethio-calendar-converter-angular

Version:
131 lines 17.2 kB
import { Injectable } from '@angular/core'; import * as i0 from "@angular/core"; export class EthiopianCalendarService { // Ethiopian calendar constants ETHIOPIAN_MONTHS = 13; ETHIOPIAN_DAYS_IN_MONTH = 30; ETHIOPIAN_PAGUME_DAYS = 5; // 6 in leap year isEthiopianLeapYear(year) { return (year + 1) % 4 === 0; } isGregorianLeapYear(year) { return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0); } validateEthiopianDate(date) { if (date.month < 1 || date.month > this.ETHIOPIAN_MONTHS) return false; if (date.month === this.ETHIOPIAN_MONTHS) { const maxDays = this.isEthiopianLeapYear(date.year) ? this.ETHIOPIAN_PAGUME_DAYS + 1 : this.ETHIOPIAN_PAGUME_DAYS; return date.day >= 1 && date.day <= maxDays; } return date.day >= 1 && date.day <= this.ETHIOPIAN_DAYS_IN_MONTH; } toGregorian(ethiopianDate) { if (!this.validateEthiopianDate(ethiopianDate)) { throw new Error('Invalid Ethiopian date'); } let { year, month, day } = ethiopianDate; // Calculate the number of days from Ethiopian new year to the given date let daysDiff = (month - 1) * this.ETHIOPIAN_DAYS_IN_MONTH + day; // Basic conversion (Ethiopian new year is typically September 11/12) let gregorianYear = year + 7; let gregorianMonth = 9; // September let gregorianDay = 10; // Start from September 10 // Adjust for Ethiopian leap year if (this.isEthiopianLeapYear(year)) { gregorianDay += 1; } // Add the difference in days gregorianDay += daysDiff; // Adjust the Gregorian date const gregorianMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; if (this.isGregorianLeapYear(gregorianYear)) { gregorianMonthDays[1] = 29; } // Adjust month and day while (gregorianDay > gregorianMonthDays[gregorianMonth - 1]) { gregorianDay -= gregorianMonthDays[gregorianMonth - 1]; gregorianMonth++; if (gregorianMonth > 12) { gregorianMonth = 1; gregorianYear++; if (this.isGregorianLeapYear(gregorianYear)) { gregorianMonthDays[1] = 29; } else { gregorianMonthDays[1] = 28; } } } return { year: gregorianYear, month: gregorianMonth, day: gregorianDay }; } toEthiopian(gregorianDate) { let { year, month, day } = gregorianDate; // Find the Ethiopian year let ethiopianYear = year - 8; // Calculate days from Ethiopian new year (September 11/12) const gregorianMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; if (this.isGregorianLeapYear(year)) { gregorianMonthDays[1] = 29; } // Calculate the Ethiopian date let ethiopianMonth = 1; let ethiopianDay = 1; // Adjust based on the Gregorian date if (month > 9 || (month === 9 && day > 11)) { ethiopianYear++; } // Calculate days from Ethiopian new year let daysDiff = 0; if (month > 9) { // Add days from September to current month for (let m = 9; m < month; m++) { daysDiff += gregorianMonthDays[m - 1]; } daysDiff += day - 11; } else if (month < 9) { // Add remaining days from September to December for (let m = 9; m <= 12; m++) { daysDiff += gregorianMonthDays[m - 1]; } // Add days from January to current month for (let m = 1; m < month; m++) { daysDiff += gregorianMonthDays[m - 1]; } daysDiff += day - 11; } else { // September daysDiff = day - 11; } // Convert days difference to Ethiopian date ethiopianMonth = Math.floor(daysDiff / 30) + 1; ethiopianDay = (daysDiff % 30) + 1; return { year: ethiopianYear, month: ethiopianMonth, day: ethiopianDay }; } // Helper method to format dates formatDate(date, isEthiopian = true) { const { year, month, day } = date; return `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}${isEthiopian ? ' (Ethiopian)' : ' (Gregorian)'}`; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarService, providedIn: 'root' }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXRoaW9waWFuLWNhbGVuZGFyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2V0aGlvcGlhbi1jYWxlbmRhci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBTTNDLE1BQU0sT0FBTyx3QkFBd0I7SUFDbkMsK0JBQStCO0lBQ2QsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztJQUM3QixxQkFBcUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxpQkFBaUI7SUFFckQsbUJBQW1CLENBQUMsSUFBWTtRQUN0QyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLG1CQUFtQixDQUFDLElBQVk7UUFDdEMsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxJQUFtQjtRQUMvQyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQjtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3ZFLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztZQUM3QixP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RyxHQUFHLEVBQUUsQ0FBQztTQUNyQjtRQUVELDRDQUE0QztRQUM1QyxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLFlBQVksR0FBRyxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFbkMsT0FBTztZQUNMLElBQUksRUFBRSxhQUFhO1lBQ25CLEtBQUssRUFBRSxjQUFjO1lBQ3JCLEdBQUcsRUFBRSxZQUFZO1NBQ2xCLENBQUM7SUFDSixDQUFDO0lBRUQsZ0NBQWdDO0lBQ2hDLFVBQVUsQ0FBQyxJQUFtQyxFQUFFLGNBQXVCLElBQUk7UUFDekUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLE9BQU8sR0FBRyxJQUFJLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQ3BGLFdBQVcsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxjQUNqQyxFQUFFLENBQUM7SUFDTCxDQUFDO3dHQXpJVSx3QkFBd0I7NEdBQXhCLHdCQUF3QixjQUZ2QixNQUFNOzs0RkFFUCx3QkFBd0I7a0JBSHBDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRXRoaW9waWFuRGF0ZSwgR3JlZ29yaWFuRGF0ZSB9IGZyb20gJy4vbW9kZWxzL2NhbGVuZGFyLm1vZGVsJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRXRoaW9waWFuQ2FsZW5kYXJTZXJ2aWNlIHtcbiAgLy8gRXRoaW9waWFuIGNhbGVuZGFyIGNvbnN0YW50c1xuICBwcml2YXRlIHJlYWRvbmx5IEVUSElPUElBTl9NT05USFMgPSAxMztcbiAgcHJpdmF0ZSByZWFkb25seSBFVEhJT1BJQU5fREFZU19JTl9NT05USCA9IDMwO1xuICBwcml2YXRlIHJlYWRvbmx5IEVUSElPUElBTl9QQUdVTUVfREFZUyA9IDU7IC8vIDYgaW4gbGVhcCB5ZWFyXG5cbiAgcHJpdmF0ZSBpc0V0aGlvcGlhbkxlYXBZZWFyKHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoeWVhciArIDEpICUgNCA9PT0gMDtcbiAgfVxuXG4gIHByaXZhdGUgaXNHcmVnb3JpYW5MZWFwWWVhcih5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHllYXIgJSA0ID09PSAwICYmIHllYXIgJSAxMDAgIT09IDApIHx8ICh5ZWFyICUgNDAwID09PSAwKTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVFdGhpb3BpYW5EYXRlKGRhdGU6IEV0aGlvcGlhbkRhdGUpOiBib29sZWFuIHtcbiAgICBpZiAoZGF0ZS5tb250aCA8IDEgfHwgZGF0ZS5tb250aCA+IHRoaXMuRVRISU9QSUFOX01PTlRIUykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkYXRlLm1vbnRoID09PSB0aGlzLkVUSElPUElBTl9NT05USFMpIHtcbiAgICAgIGNvbnN0IG1heERheXMgPSB0aGlzLmlzRXRoaW9waWFuTGVhcFllYXIoZGF0ZS55ZWFyKSA/IFxuICAgICAgICB0aGlzLkVUSElPUElBTl9QQUdVTUVfREFZUyArIDEgOiBcbiAgICAgICAgdGhpcy5FVEhJT1BJQU5fUEFHVU1FX0RBWVM7XG4gICAgICByZXR1cm4gZGF0ZS5kYXkgPj0gMSAmJiBkYXRlLmRheSA8PSBtYXhEYXlzO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZS5kYXkgPj0gMSAmJiBkYXRlLmRheSA8PSB0aGlzLkVUSElPUElBTl9EQVlTX0lOX01PTlRIO1xuICB9XG5cbiAgdG9HcmVnb3JpYW4oZXRoaW9waWFuRGF0ZTogRXRoaW9waWFuRGF0ZSk6IEdyZWdvcmlhbkRhdGUge1xuICAgIGlmICghdGhpcy52YWxpZGF0ZUV0aGlvcGlhbkRhdGUoZXRoaW9waWFuRGF0ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBFdGhpb3BpYW4gZGF0ZScpO1xuICAgIH1cblxuICAgIGxldCB7IHllYXIsIG1vbnRoLCBkYXkgfSA9IGV0aGlvcGlhbkRhdGU7XG4gICAgXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZGF5cyBmcm9tIEV0aGlvcGlhbiBuZXcgeWVhciB0byB0aGUgZ2l2ZW4gZGF0ZVxuICAgIGxldCBkYXlzRGlmZiA9IChtb250aCAtIDEpICogdGhpcy5FVEhJT1BJQU5fREFZU19JTl9NT05USCArIGRheTtcbiAgICBcbiAgICAvLyBCYXNpYyBjb252ZXJzaW9uIChFdGhpb3BpYW4gbmV3IHllYXIgaXMgdHlwaWNhbGx5IFNlcHRlbWJlciAxMS8xMilcbiAgICBsZXQgZ3JlZ29yaWFuWWVhciA9IHllYXIgKyA3O1xuICAgIGxldCBncmVnb3JpYW5Nb250aCA9IDk7IC8vIFNlcHRlbWJlclxuICAgIGxldCBncmVnb3JpYW5EYXkgPSAxMDsgLy8gU3RhcnQgZnJvbSBTZXB0ZW1iZXIgMTBcblxuICAgIC8vIEFkanVzdCBmb3IgRXRoaW9waWFuIGxlYXAgeWVhclxuICAgIGlmICh0aGlzLmlzRXRoaW9waWFuTGVhcFllYXIoeWVhcikpIHtcbiAgICAgIGdyZWdvcmlhbkRheSArPSAxO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgZGlmZmVyZW5jZSBpbiBkYXlzXG4gICAgZ3JlZ29yaWFuRGF5ICs9IGRheXNEaWZmO1xuXG4gICAgLy8gQWRqdXN0IHRoZSBHcmVnb3JpYW4gZGF0ZVxuICAgIGNvbnN0IGdyZWdvcmlhbk1vbnRoRGF5cyA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcbiAgICBpZiAodGhpcy5pc0dyZWdvcmlhbkxlYXBZZWFyKGdyZWdvcmlhblllYXIpKSB7XG4gICAgICBncmVnb3JpYW5Nb250aERheXNbMV0gPSAyOTtcbiAgICB9XG5cbiAgICAvLyBBZGp1c3QgbW9udGggYW5kIGRheVxuICAgIHdoaWxlIChncmVnb3JpYW5EYXkgPiBncmVnb3JpYW5Nb250aERheXNbZ3JlZ29yaWFuTW9udGggLSAxXSkge1xuICAgICAgZ3JlZ29yaWFuRGF5IC09IGdyZWdvcmlhbk1vbnRoRGF5c1tncmVnb3JpYW5Nb250aCAtIDFdO1xuICAgICAgZ3JlZ29yaWFuTW9udGgrKztcbiAgICAgIGlmIChncmVnb3JpYW5Nb250aCA+IDEyKSB7XG4gICAgICAgIGdyZWdvcmlhbk1vbnRoID0gMTtcbiAgICAgICAgZ3JlZ29yaWFuWWVhcisrO1xuICAgICAgICBpZiAodGhpcy5pc0dyZWdvcmlhbkxlYXBZZWFyKGdyZWdvcmlhblllYXIpKSB7XG4gICAgICAgICAgZ3JlZ29yaWFuTW9udGhEYXlzWzFdID0gMjk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JlZ29yaWFuTW9udGhEYXlzWzFdID0gMjg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeWVhcjogZ3JlZ29yaWFuWWVhcixcbiAgICAgIG1vbnRoOiBncmVnb3JpYW5Nb250aCxcbiAgICAgIGRheTogZ3JlZ29yaWFuRGF5XG4gICAgfTtcbiAgfVxuXG4gIHRvRXRoaW9waWFuKGdyZWdvcmlhbkRhdGU6IEdyZWdvcmlhbkRhdGUpOiBFdGhpb3BpYW5EYXRlIHtcbiAgICBsZXQgeyB5ZWFyLCBtb250aCwgZGF5IH0gPSBncmVnb3JpYW5EYXRlO1xuICAgIFxuICAgIC8vIEZpbmQgdGhlIEV0aGlvcGlhbiB5ZWFyXG4gICAgbGV0IGV0aGlvcGlhblllYXIgPSB5ZWFyIC0gODtcbiAgICBcbiAgICAvLyBDYWxjdWxhdGUgZGF5cyBmcm9tIEV0aGlvcGlhbiBuZXcgeWVhciAoU2VwdGVtYmVyIDExLzEyKVxuICAgIGNvbnN0IGdyZWdvcmlhbk1vbnRoRGF5cyA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcbiAgICBpZiAodGhpcy5pc0dyZWdvcmlhbkxlYXBZZWFyKHllYXIpKSB7XG4gICAgICBncmVnb3JpYW5Nb250aERheXNbMV0gPSAyOTtcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIEV0aGlvcGlhbiBkYXRlXG4gICAgbGV0IGV0aGlvcGlhbk1vbnRoID0gMTtcbiAgICBsZXQgZXRoaW9waWFuRGF5ID0gMTtcbiAgICBcbiAgICAvLyBBZGp1c3QgYmFzZWQgb24gdGhlIEdyZWdvcmlhbiBkYXRlXG4gICAgaWYgKG1vbnRoID4gOSB8fCAobW9udGggPT09IDkgJiYgZGF5ID4gMTEpKSB7XG4gICAgICBldGhpb3BpYW5ZZWFyKys7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGRheXMgZnJvbSBFdGhpb3BpYW4gbmV3IHllYXJcbiAgICBsZXQgZGF5c0RpZmYgPSAwO1xuICAgIGlmIChtb250aCA+IDkpIHtcbiAgICAgIC8vIEFkZCBkYXlzIGZyb20gU2VwdGVtYmVyIHRvIGN1cnJlbnQgbW9udGhcbiAgICAgIGZvciAobGV0IG0gPSA5OyBtIDwgbW9udGg7IG0rKykge1xuICAgICAgICBkYXlzRGlmZiArPSBncmVnb3JpYW5Nb250aERheXNbbSAtIDFdO1xuICAgICAgfVxuICAgICAgZGF5c0RpZmYgKz0gZGF5IC0gMTE7XG4gICAgfSBlbHNlIGlmIChtb250aCA8IDkpIHtcbiAgICAgIC8vIEFkZCByZW1haW5pbmcgZGF5cyBmcm9tIFNlcHRlbWJlciB0byBEZWNlbWJlclxuICAgICAgZm9yIChsZXQgbSA9IDk7IG0gPD0gMTI7IG0rKykge1xuICAgICAgICBkYXlzRGlmZiArPSBncmVnb3JpYW5Nb250aERheXNbbSAtIDFdO1xuICAgICAgfVxuICAgICAgLy8gQWRkIGRheXMgZnJvbSBKYW51YXJ5IHRvIGN1cnJlbnQgbW9udGhcbiAgICAgIGZvciAobGV0IG0gPSAxOyBtIDwgbW9udGg7IG0rKykge1xuICAgICAgICBkYXlzRGlmZiArPSBncmVnb3JpYW5Nb250aERheXNbbSAtIDFdO1xuICAgICAgfVxuICAgICAgZGF5c0RpZmYgKz0gZGF5IC0gMTE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNlcHRlbWJlclxuICAgICAgZGF5c0RpZmYgPSBkYXkgLSAxMTtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IGRheXMgZGlmZmVyZW5jZSB0byBFdGhpb3BpYW4gZGF0ZVxuICAgIGV0aGlvcGlhbk1vbnRoID0gTWF0aC5mbG9vcihkYXlzRGlmZiAvIDMwKSArIDE7XG4gICAgZXRoaW9waWFuRGF5ID0gKGRheXNEaWZmICUgMzApICsgMTtcblxuICAgIHJldHVybiB7XG4gICAgICB5ZWFyOiBldGhpb3BpYW5ZZWFyLFxuICAgICAgbW9udGg6IGV0aGlvcGlhbk1vbnRoLFxuICAgICAgZGF5OiBldGhpb3BpYW5EYXlcbiAgICB9O1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBmb3JtYXQgZGF0ZXNcbiAgZm9ybWF0RGF0ZShkYXRlOiBFdGhpb3BpYW5EYXRlIHwgR3JlZ29yaWFuRGF0ZSwgaXNFdGhpb3BpYW46IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IHllYXIsIG1vbnRoLCBkYXkgfSA9IGRhdGU7XG4gICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGgudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfS0ke2RheS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9JHtcbiAgICAgIGlzRXRoaW9waWFuID8gJyAoRXRoaW9waWFuKScgOiAnIChHcmVnb3JpYW4pJ1xuICAgIH1gO1xuICB9XG59ICJdfQ==