adbsmagic
Version:
A package for AD to BS and BS to AD date conversion
170 lines (169 loc) • 6.22 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.nepaliToEnglish = exports.englishToNepali = void 0;
const validateDate_1 = require("./validateDate");
const calendarData_1 = __importDefault(require("./calendarData"));
const getDayOfTheWeek = (day) => {
const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
return days[day - 1];
};
const getEnglishMonthName = (month) => {
const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
return months[month - 1];
};
const getNepaliMonthName = (month) => {
const months = [
'Baishakh', 'Jestha', 'Asar', 'Shrawan', 'Bhadra', 'Ashwin',
'Kartik', 'Mangsir', 'Poush', 'Magh', 'Falgun', 'Chaitra'
];
return months[month - 1];
};
/**
* currently can only calculate the date between AD 1944-2033...
* Convert English (Gregorian) date to Nepali (Bikram Sambat) date
*/
const englishToNepali = (yy, mm, dd) => {
const nepaliDate = {
year: null,
month: null,
date: null,
day: null,
nmonth: null,
num_day: null,
};
if (!(0, validateDate_1.validateEnglishDateRange)(yy, mm, dd)) {
return nepaliDate;
}
// Constants for initial reference date
const referenceEnglishYear = 1944;
const referenceNepaliYear = 2000;
const referenceNepaliMonth = 9;
const referenceNepaliDay = 17 - 1;
// Standard and leap year month days
const monthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
const leapMonthDays = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
// Calculate total days from reference date
let totalEnglishDays = referenceNepaliDay;
// Add days for years
for (let i = 0; i < (yy - referenceEnglishYear); i++) {
const yearToCheck = referenceEnglishYear + i;
const daysInYear = (0, validateDate_1.validateLeapYear)(yearToCheck) ? 366 : 365;
totalEnglishDays += daysInYear;
}
// Add days for months in the target year
for (let i = 0; i < (mm - 1); i++) {
totalEnglishDays += (0, validateDate_1.validateLeapYear)(yy) ? leapMonthDays[i] : monthDays[i];
}
// Add remaining days
totalEnglishDays += dd;
let nepYear = referenceNepaliYear;
let nepMonth = referenceNepaliMonth;
let nepDay = 0;
let dayOfWeek = 1; // Start with reference day of week
// Calendar data array index
let bsCalendarIndex = 0;
// Count nepali date from array
while (totalEnglishDays > 0) {
// Get days in current Nepali month
const daysInMonth = calendarData_1.default[bsCalendarIndex][nepMonth];
// Increment day and handle month/year transitions
nepDay++;
dayOfWeek = dayOfWeek % 7 + 1;
if (nepDay > daysInMonth) {
nepMonth++;
nepDay = 1;
if (nepMonth > 12) {
nepYear++;
nepMonth = 1;
bsCalendarIndex++;
}
}
totalEnglishDays--;
}
return {
year: nepYear,
month: nepMonth,
date: nepDay,
day: getDayOfTheWeek(dayOfWeek),
nmonth: getNepaliMonthName(nepMonth),
num_day: dayOfWeek
};
};
exports.englishToNepali = englishToNepali;
/**
* Currently can only calculate the date between BS 2009 and 2089
* Convert Nepali (Bikram Sambat) date to English (Gregorian) date
*/
const nepaliToEnglish = (yy, mm, dd) => {
// Initial reference dates
const referenceEnglishYear = 1943;
const referenceEnglishMonth = 4;
const referenceEnglishDay = 13; // 14-1, the initial English date
const referenceNepaliYear = 2000;
// const referenceNepaliMonth = 1;
// const referenceNepaliDay = 1; // initial equivalent Nepali date
// Month days for regular and leap years
const monthDays = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
const leapMonthDays = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
// Check if date is in valid range
if (!(0, validateDate_1.validateNepaliDateRange)(yy, mm, dd)) {
throw new Error("Date out of range");
}
// Count total days from the reference date
let totalNepaliDays = 0;
// Count days for years
for (let i = 0; i < (yy - referenceNepaliYear); i++) {
const yearIndex = i;
// Add days for all 12 months of each year
for (let j = 1; j <= 12; j++) {
totalNepaliDays += calendarData_1.default[yearIndex][j];
}
}
// Count days for months in the target year
const yearIndex = yy - referenceNepaliYear;
for (let j = 1; j < mm; j++) {
totalNepaliDays += calendarData_1.default[yearIndex][j];
}
// Add days of the target month
totalNepaliDays += dd;
// Calculate equivalent English date
let englishDay = referenceEnglishDay;
let englishMonth = referenceEnglishMonth;
let englishYear = referenceEnglishYear;
let dayOfWeek = 3; // Reference day was 4-1 (Wednesday)
// Calculate the English date
while (totalNepaliDays !== 0) {
// Determine days in current English month
const daysInMonth = (0, validateDate_1.validateLeapYear)(englishYear)
? leapMonthDays[englishMonth]
: monthDays[englishMonth];
englishDay++;
dayOfWeek++;
// Handle month and year transitions
if (englishDay > daysInMonth) {
englishMonth++;
englishDay = 1;
if (englishMonth > 12) {
englishYear++;
englishMonth = 1;
}
}
// Reset day of week
if (dayOfWeek > 7) {
dayOfWeek = 1;
}
totalNepaliDays--;
}
return {
year: englishYear,
month: englishMonth,
date: englishDay,
day: getDayOfTheWeek(dayOfWeek),
nmonth: getEnglishMonthName(englishMonth),
num_day: dayOfWeek
};
};
exports.nepaliToEnglish = nepaliToEnglish;