ethio-calendar-converter-angular
Version:
Ethiopian Calendar Converter for Angular applications
131 lines • 17.2 kB
JavaScript
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==