|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import {AnyCalendarDate} from '../types'; |
|
import {CalendarDate} from '../CalendarDate'; |
|
import {fromExtendedYear, getExtendedYear, GregorianCalendar} from './GregorianCalendar'; |
|
import {Mutable} from '../utils'; |
|
|
|
const TAIWAN_ERA_START = 1911; |
|
|
|
function gregorianYear(date: AnyCalendarDate) { |
|
return date.era === 'minguo' |
|
? date.year + TAIWAN_ERA_START |
|
: 1 - date.year + TAIWAN_ERA_START; |
|
} |
|
|
|
function gregorianToTaiwan(year: number): [string, number] { |
|
let y = year - TAIWAN_ERA_START; |
|
if (y > 0) { |
|
return ['minguo', y]; |
|
} else { |
|
return ['before_minguo', 1 - y]; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
export class TaiwanCalendar extends GregorianCalendar { |
|
identifier = 'roc'; |
|
|
|
fromJulianDay(jd: number): CalendarDate { |
|
let date = super.fromJulianDay(jd); |
|
let extendedYear = getExtendedYear(date.era, date.year); |
|
let [era, year] = gregorianToTaiwan(extendedYear); |
|
return new CalendarDate(this, era, year, date.month, date.day); |
|
} |
|
|
|
toJulianDay(date: AnyCalendarDate) { |
|
return super.toJulianDay(toGregorian(date)); |
|
} |
|
|
|
getEras() { |
|
return ['before_minguo', 'minguo']; |
|
} |
|
|
|
balanceDate(date: Mutable<AnyCalendarDate>) { |
|
let [era, year] = gregorianToTaiwan(gregorianYear(date)); |
|
date.era = era; |
|
date.year = year; |
|
} |
|
|
|
isInverseEra(date: AnyCalendarDate): boolean { |
|
return date.era === 'before_minguo'; |
|
} |
|
|
|
getDaysInMonth(date: AnyCalendarDate): number { |
|
return super.getDaysInMonth(toGregorian(date)); |
|
} |
|
|
|
getYearsInEra(date: AnyCalendarDate): number { |
|
return date.era === 'before_minguo' ? 9999 : 9999 - TAIWAN_ERA_START; |
|
} |
|
} |
|
|
|
function toGregorian(date: AnyCalendarDate) { |
|
let [era, year] = fromExtendedYear(gregorianYear(date)); |
|
return new CalendarDate( |
|
era, |
|
year, |
|
date.month, |
|
date.day |
|
); |
|
} |
|
|