bangla-date-utils
Version:
A utility package for converting and formatting dates in the Bangla calendar system with support for Bangla numerals.
436 lines (435 loc) • 14.2 kB
JavaScript
;
exports.__esModule = true;
exports.formatBanglaDateString = exports.getCurrentBanglaDate = exports.getBanglaWeekday = exports.convertBanglaToGregorian = exports.convertGregorianToBangla = exports.getDaysInBanglaMonth = exports.isBanglaLeapYear = exports.BANGLA_WEEKDAYS = exports.BANGLA_SEASONS = exports.BANGLA_MONTHS = void 0;
// Constants for Bangla calendar
exports.BANGLA_MONTHS = [
"বৈশাখ",
"জ্যৈষ্ঠ",
"আষাঢ়",
"শ্রাবণ",
"ভাদ্র",
"আশ্বিন",
"কার্তিক",
"অগ্রহায়ণ",
"পৌষ",
"মাঘ",
"ফাল্গুন",
"চৈত্র", // Choitro
];
exports.BANGLA_SEASONS = [
"গ্রীষ্ম",
"বর্ষা",
"শরৎ",
"হেমন্ত",
"শীত",
"বসন্ত", // Boshonto (Spring)
];
exports.BANGLA_WEEKDAYS = [
"রবিবার",
"সোমবার",
"মঙ্গলবার",
"বুধবার",
"বৃহস্পতিবার",
"শুক্রবার",
"শনিবার", // Saturday
];
/**
* Determines if the given Bangla year is a leap year
* @param year Bangla year
* @returns boolean indicating if it's a leap year
*/
var isBanglaLeapYear = function (year) {
// Convert Bangla year to Gregorian year (approximate)
var gregorianYear = year - 593;
// Gregorian leap year calculation
return (gregorianYear % 4 === 0 && gregorianYear % 100 !== 0) || gregorianYear % 400 === 0;
};
exports.isBanglaLeapYear = isBanglaLeapYear;
/**
* Get the number of days in a Bangla month
* @param month Bangla month (1-12)
* @param year Bangla year
* @returns number of days in the month
*/
var getDaysInBanglaMonth = function (month, year) {
// Bangla months have either 30 or 31 days
// Falgun (11th month) has 29 days in non-leap years and 30 days in leap years
if (month === 11) {
return (0, exports.isBanglaLeapYear)(year) ? 30 : 29;
}
// Chaitra (12th month) has 30 days
if (month === 12) {
return 30;
}
// Other months alternate between 31 and 30 days
return month % 2 === 1 ? 31 : 30;
};
exports.getDaysInBanglaMonth = getDaysInBanglaMonth;
/**
* Convert Gregorian date to Bangla date
* @param date Gregorian date
* @returns BanglaDate object
*/
var convertGregorianToBangla = function (date) {
var gregorianDate = date.getDate();
var gregorianMonth = date.getMonth() + 1; // 1-12
var gregorianYear = date.getFullYear();
var banglaDate;
var banglaMonth;
var banglaYear;
// Bangla new year starts around April 14
// This is a simplified calculation - a more accurate one would account for leap years
if (gregorianMonth < 4 || (gregorianMonth === 4 && gregorianDate < 14)) {
// Jan to mid-April: Bangla year is Gregorian year - 594
banglaYear = gregorianYear - 594;
}
else {
// Mid-April to Dec: Bangla year is Gregorian year - 593
banglaYear = gregorianYear - 593;
}
// Approximate mapping of Gregorian to Bangla dates
// This is a simplified version - a more accurate version would use astronomical calculations
if (gregorianMonth === 4) {
// April
if (gregorianDate < 14) {
banglaMonth = 12; // Chaitra
banglaDate = gregorianDate + 17;
}
else {
banglaMonth = 1; // Boishakh
banglaDate = gregorianDate - 13;
}
}
else if (gregorianMonth === 5) {
// May
if (gregorianDate < 15) {
banglaMonth = 1; // Boishakh
banglaDate = gregorianDate + 17;
}
else {
banglaMonth = 2; // Jyoishtho
banglaDate = gregorianDate - 14;
}
}
else if (gregorianMonth === 6) {
// June
if (gregorianDate < 15) {
banglaMonth = 2; // Jyoishtho
banglaDate = gregorianDate + 17;
}
else {
banglaMonth = 3; // Asharh
banglaDate = gregorianDate - 14;
}
}
else if (gregorianMonth === 7) {
// July
if (gregorianDate < 16) {
banglaMonth = 3; // Asharh
banglaDate = gregorianDate + 16;
}
else {
banglaMonth = 4; // Shrabon
banglaDate = gregorianDate - 15;
}
}
else if (gregorianMonth === 8) {
// August
if (gregorianDate < 16) {
banglaMonth = 4; // Shrabon
banglaDate = gregorianDate + 16;
}
else {
banglaMonth = 5; // Bhadro
banglaDate = gregorianDate - 15;
}
}
else if (gregorianMonth === 9) {
// September
if (gregorianDate < 16) {
banglaMonth = 5; // Bhadro
banglaDate = gregorianDate + 16;
}
else {
banglaMonth = 6; // Ashwin
banglaDate = gregorianDate - 15;
}
}
else if (gregorianMonth === 10) {
// October
if (gregorianDate < 16) {
banglaMonth = 6; // Ashwin
banglaDate = gregorianDate + 15;
}
else {
banglaMonth = 7; // Kartik
banglaDate = gregorianDate - 15;
}
}
else if (gregorianMonth === 11) {
// November
if (gregorianDate < 15) {
banglaMonth = 7; // Kartik
banglaDate = gregorianDate + 16;
}
else {
banglaMonth = 8; // Ogrohayon
banglaDate = gregorianDate - 14;
}
}
else if (gregorianMonth === 12) {
// December
if (gregorianDate < 15) {
banglaMonth = 8; // Ogrohayon
banglaDate = gregorianDate + 16;
}
else {
banglaMonth = 9; // Poush
banglaDate = gregorianDate - 14;
}
}
else if (gregorianMonth === 1) {
// January
if (gregorianDate < 14) {
banglaMonth = 9; // Poush
banglaDate = gregorianDate + 17;
}
else {
banglaMonth = 10; // Magh
banglaDate = gregorianDate - 13;
}
}
else if (gregorianMonth === 2) {
// February
if (gregorianDate < 13) {
banglaMonth = 10; // Magh
banglaDate = gregorianDate + 18;
}
else {
banglaMonth = 11; // Falgun
banglaDate = gregorianDate - 12;
}
}
else {
// March
if (gregorianDate < 15) {
banglaMonth = 11; // Falgun
banglaDate = gregorianDate + 16;
}
else {
banglaMonth = 12; // Chaitra
banglaDate = gregorianDate - 14;
}
}
// Get season based on Bangla month
var seasonIndex = Math.floor((banglaMonth - 1) / 2);
if (seasonIndex > 5)
seasonIndex = 5;
return {
year: banglaYear,
month: banglaMonth,
date: banglaDate,
monthName: exports.BANGLA_MONTHS[banglaMonth - 1],
season: exports.BANGLA_SEASONS[seasonIndex]
};
};
exports.convertGregorianToBangla = convertGregorianToBangla;
/**
* Convert Bangla date to Gregorian date
* @param banglaDate Bangla date (day)
* @param banglaMonth Bangla month (1-12)
* @param banglaYear Bangla year
* @returns JavaScript Date object
*/
var convertBanglaToGregorian = function (banglaDate, banglaMonth, banglaYear) {
var gregorianYear = banglaYear + 593;
var gregorianMonth = 0; // 0-11 for JavaScript Date
var gregorianDate = 0;
// Approximate mapping of Bangla to Gregorian dates
// This is a simplified version - a more accurate version would use astronomical calculations
if (banglaMonth === 1) {
// Boishakh (mid-April to mid-May)
if (banglaDate <= 18) {
gregorianMonth = 3; // April
gregorianDate = banglaDate + 13;
}
else {
gregorianMonth = 4; // May
gregorianDate = banglaDate - 18;
}
}
else if (banglaMonth === 2) {
// Jyoishtho (mid-May to mid-June)
if (banglaDate <= 17) {
gregorianMonth = 4; // May
gregorianDate = banglaDate + 14;
}
else {
gregorianMonth = 5; // June
gregorianDate = banglaDate - 17;
}
}
else if (banglaMonth === 3) {
// Asharh (mid-June to mid-July)
if (banglaDate <= 16) {
gregorianMonth = 5; // June
gregorianDate = banglaDate + 14;
}
else {
gregorianMonth = 6; // July
gregorianDate = banglaDate - 16;
}
}
else if (banglaMonth === 4) {
// Shrabon (mid-July to mid-August)
if (banglaDate <= 16) {
gregorianMonth = 6; // July
gregorianDate = banglaDate + 15;
}
else {
gregorianMonth = 7; // August
gregorianDate = banglaDate - 16;
}
}
else if (banglaMonth === 5) {
// Bhadro (mid-August to mid-September)
if (banglaDate <= 16) {
gregorianMonth = 7; // August
gregorianDate = banglaDate + 15;
}
else {
gregorianMonth = 8; // September
gregorianDate = banglaDate - 16;
}
}
else if (banglaMonth === 6) {
// Ashwin (mid-September to mid-October)
if (banglaDate <= 15) {
gregorianMonth = 8; // September
gregorianDate = banglaDate + 15;
}
else {
gregorianMonth = 9; // October
gregorianDate = banglaDate - 15;
}
}
else if (banglaMonth === 7) {
// Kartik (mid-October to mid-November)
if (banglaDate <= 16) {
gregorianMonth = 9; // October
gregorianDate = banglaDate + 15;
}
else {
gregorianMonth = 10; // November
gregorianDate = banglaDate - 16;
}
}
else if (banglaMonth === 8) {
// Ogrohayon (mid-November to mid-December)
if (banglaDate <= 15) {
gregorianMonth = 10; // November
gregorianDate = banglaDate + 14;
}
else {
gregorianMonth = 11; // December
gregorianDate = banglaDate - 15;
}
}
else if (banglaMonth === 9) {
// Poush (mid-December to mid-January)
if (banglaDate <= 16) {
gregorianMonth = 11; // December
gregorianDate = banglaDate + 14;
}
else {
gregorianMonth = 0; // January
gregorianDate = banglaDate - 16;
gregorianYear += 1;
}
}
else if (banglaMonth === 10) {
// Magh (mid-January to mid-February)
if (banglaDate <= 18) {
gregorianMonth = 0; // January
gregorianDate = banglaDate + 13;
}
else {
gregorianMonth = 1; // February
gregorianDate = banglaDate - 18;
}
}
else if (banglaMonth === 11) {
// Falgun (mid-February to mid-March)
if (banglaDate <= 16) {
gregorianMonth = 1; // February
gregorianDate = banglaDate + 12;
}
else {
gregorianMonth = 2; // March
gregorianDate = banglaDate - 16;
}
}
else {
// Chaitra (mid-March to mid-April)
if (banglaDate <= 17) {
gregorianMonth = 2; // March
gregorianDate = banglaDate + 14;
}
else {
gregorianMonth = 3; // April
gregorianDate = banglaDate - 17;
}
}
return new Date(gregorianYear, gregorianMonth, gregorianDate);
};
exports.convertBanglaToGregorian = convertBanglaToGregorian;
/**
* Get the Bangla weekday name for a given date
* @param date JavaScript Date object
* @returns Bangla weekday name
*/
var getBanglaWeekday = function (date) {
var dayIndex = date.getDay(); // 0-6, where 0 is Sunday
return exports.BANGLA_WEEKDAYS[dayIndex];
};
exports.getBanglaWeekday = getBanglaWeekday;
/**
* Get the current Bangla date
* @returns BanglaDate object for the current date
*/
var getCurrentBanglaDate = function () {
return (0, exports.convertGregorianToBangla)(new Date());
};
exports.getCurrentBanglaDate = getCurrentBanglaDate;
/**
* Format a Bangla date as a string
* @param banglaDate BanglaDate object
* @param format Format string (e.g., 'full', 'medium', 'short')
* @returns Formatted Bangla date string
*/
var formatBanglaDateString = function (banglaDate, format) {
if (format === void 0) { format = "medium"; }
var date = banglaDate.date, month = banglaDate.month, year = banglaDate.year, monthName = banglaDate.monthName, season = banglaDate.season;
// Convert numbers to Bangla numerals
var banglaNumerals = ["০", "১", "২", "৩", "৪", "৫", "৬", "৭", "৮", "৯"];
var toBanglaNumerals = function (num) {
return num
.toString()
.split("")
.map(function (digit) { return banglaNumerals[Number.parseInt(digit)]; })
.join("");
};
var banglaDateNum = toBanglaNumerals(date);
var banglaYear = toBanglaNumerals(year);
if (format === "full") {
return "".concat(banglaDateNum, " ").concat(monthName, " ").concat(banglaYear, " (").concat(season, ")");
}
else if (format === "short") {
return "".concat(banglaDateNum, "/").concat(toBanglaNumerals(month), "/").concat(banglaYear);
}
else {
// medium format
return "".concat(banglaDateNum, " ").concat(monthName, " ").concat(banglaYear);
}
};
exports.formatBanglaDateString = formatBanglaDateString;