UNPKG

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
"use strict"; 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;