/* | |
* Copyright 2020 Adobe. All rights reserved. | |
* This file is licensed to you under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. You may obtain a copy | |
* of the License at http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software distributed under | |
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS | |
* OF ANY KIND, either express or implied. See the License for the specific language | |
* governing permissions and limitations under the License. | |
*/ | |
// Portions of the code in this file are based on code from ICU. | |
// Original licensing can be found in the NOTICE file in the root directory of this source tree. | |
import {AnyCalendarDate} from '../types'; | |
import {CalendarDate} from '../CalendarDate'; | |
import {fromExtendedYear, getExtendedYear, GregorianCalendar} from './GregorianCalendar'; | |
const BUDDHIST_ERA_START = -543; | |
/** | |
* The Buddhist calendar is the same as the Gregorian calendar, but counts years | |
* starting from the birth of Buddha in 543 BC (Gregorian). It supports only one | |
* era, identified as 'BE'. | |
*/ | |
export class BuddhistCalendar extends GregorianCalendar { | |
identifier = 'buddhist'; | |
fromJulianDay(jd: number): CalendarDate { | |
let gregorianDate = super.fromJulianDay(jd); | |
let year = getExtendedYear(gregorianDate.era, gregorianDate.year); | |
return new CalendarDate( | |
this, | |
year - BUDDHIST_ERA_START, | |
gregorianDate.month, | |
gregorianDate.day | |
); | |
} | |
toJulianDay(date: AnyCalendarDate) { | |
return super.toJulianDay(toGregorian(date)); | |
} | |
getEras() { | |
return ['BE']; | |
} | |
getDaysInMonth(date: AnyCalendarDate): number { | |
return super.getDaysInMonth(toGregorian(date)); | |
} | |
balanceDate() {} | |
} | |
function toGregorian(date: AnyCalendarDate) { | |
let [era, year] = fromExtendedYear(date.year + BUDDHIST_ERA_START); | |
return new CalendarDate( | |
era, | |
year, | |
date.month, | |
date.day | |
); | |
} | |