tibetan-date-calculator
Version:
A library to calculate tibetan calendar details. It is based on Svante Janson's paper www2.math.uu.se/~svante/papers/calendars/tibet.pdf
35 lines (29 loc) • 1.45 kB
text/typescript
import { unixFromJulian, monthCountFromTibetan, trueDateFromMonthCountDay as getTrueDate } from '../conversions';
import { isDoubledMonth, getDateStr } from '../helpers';
import { Month } from '../types';
/**
* Calculates full information about a Tibetan month: whether it is doubled or not,
* and the western start and end date for it.
* The start_date and end_date correspond to the leap month if isLeapMonth is true,
* otherwise to the main month (i.e the second of the two).
*
* @param {object} arg
* @param {number} arg.year - the Tibetan year
* @param {number} arg.month - the Tibetan month number (1 to 12)
* @param {boolean} [arg.isLeapMonth=false] - if leap month or not
* @returns {Month}
*/
const getMonthFromTibetan = ({ year, month, isLeapMonth = false }: { year: number; month: number; isLeapMonth?: boolean }): Month => {
const hasLeap = isDoubledMonth(year, month);
const isLeap = isLeapMonth && hasLeap;
// calculate the Julian date 1st and last of the month
const monthCount = monthCountFromTibetan({ year, month, isLeapMonth: isLeap });
const jdFirst = 1 + Math.floor(getTrueDate(30, monthCount - 1));
const jdLast = Math.floor(getTrueDate(30, monthCount));
const startDate = getDateStr(unixFromJulian(jdFirst));
const endDate = getDateStr(unixFromJulian(jdLast));
return {
year, month, isLeapMonth: isLeap, isDoubledMonth: hasLeap, startDate, endDate,
};
};
export default getMonthFromTibetan;