|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import {AnyCalendarDate} from '../types'; |
|
import {CalendarDate} from '../CalendarDate'; |
|
import {fromExtendedYear, GregorianCalendar, gregorianToJulianDay, isLeapYear} from './GregorianCalendar'; |
|
|
|
|
|
const INDIAN_ERA_START = 78; |
|
|
|
|
|
const INDIAN_YEAR_START = 80; |
|
|
|
|
|
|
|
|
|
|
|
|
|
export class IndianCalendar extends GregorianCalendar { |
|
identifier = 'indian'; |
|
|
|
fromJulianDay(jd: number): CalendarDate { |
|
|
|
let date = super.fromJulianDay(jd); |
|
|
|
|
|
let indianYear = date.year - INDIAN_ERA_START; |
|
|
|
|
|
let yDay = jd - gregorianToJulianDay(date.era, date.year, 1, 1); |
|
|
|
let leapMonth: number; |
|
if (yDay < INDIAN_YEAR_START) { |
|
|
|
indianYear--; |
|
|
|
|
|
leapMonth = isLeapYear(date.year - 1) ? 31 : 30; |
|
yDay += leapMonth + (31 * 5) + (30 * 3) + 10; |
|
} else { |
|
|
|
leapMonth = isLeapYear(date.year) ? 31 : 30; |
|
yDay -= INDIAN_YEAR_START; |
|
} |
|
|
|
let indianMonth: number; |
|
let indianDay: number; |
|
if (yDay < leapMonth) { |
|
indianMonth = 1; |
|
indianDay = yDay + 1; |
|
} else { |
|
let mDay = yDay - leapMonth; |
|
if (mDay < (31 * 5)) { |
|
indianMonth = Math.floor(mDay / 31) + 2; |
|
indianDay = (mDay % 31) + 1; |
|
} else { |
|
mDay -= 31 * 5; |
|
indianMonth = Math.floor(mDay / 30) + 7; |
|
indianDay = (mDay % 30) + 1; |
|
} |
|
} |
|
|
|
return new CalendarDate(this, indianYear, indianMonth, indianDay); |
|
} |
|
|
|
toJulianDay(date: AnyCalendarDate) { |
|
let extendedYear = date.year + INDIAN_ERA_START; |
|
let [era, year] = fromExtendedYear(extendedYear); |
|
|
|
let leapMonth: number; |
|
let jd: number; |
|
if (isLeapYear(year)) { |
|
leapMonth = 31; |
|
jd = gregorianToJulianDay(era, year, 3, 21); |
|
} else { |
|
leapMonth = 30; |
|
jd = gregorianToJulianDay(era, year, 3, 22); |
|
} |
|
|
|
if (date.month === 1) { |
|
return jd + date.day - 1; |
|
} |
|
|
|
jd += leapMonth + Math.min(date.month - 2, 5) * 31; |
|
|
|
if (date.month >= 8) { |
|
jd += (date.month - 7) * 30; |
|
} |
|
|
|
jd += date.day - 1; |
|
return jd; |
|
} |
|
|
|
getDaysInMonth(date: AnyCalendarDate): number { |
|
if (date.month === 1 && isLeapYear(date.year + INDIAN_ERA_START)) { |
|
return 31; |
|
} |
|
|
|
if (date.month >= 2 && date.month <= 6) { |
|
return 31; |
|
} |
|
|
|
return 30; |
|
} |
|
|
|
getYearsInEra(): number { |
|
|
|
|
|
return 9919; |
|
} |
|
|
|
getEras() { |
|
return ['saka']; |
|
} |
|
|
|
balanceDate() {} |
|
} |
|
|