bangla-date-utils
Version:
A utility package for converting and formatting dates in the Bangla calendar system with support for Bangla numerals.
171 lines (147 loc) • 5.47 kB
text/typescript
import { convertGregorianToBangla, BanglaDate, BANGLA_MONTHS, BANGLA_SEASONS, BANGLA_WEEKDAYS } from "./banglaCalendar"
// Re-export the constants
export { BANGLA_MONTHS, BANGLA_SEASONS, BANGLA_WEEKDAYS, BanglaDate }
// Define format options
export type BanglaDateFormat = "full" | "medium" | "short" | "custom"
// Helper to convert a number to Bangla numerals
const banglaNumerals = ["০", "১", "২", "৩", "৪", "৫", "৬", "৭", "৮", "৯"]
export const toBanglaNumerals = (num: number): string => {
return num
.toString()
.split("")
.map((digit) => banglaNumerals[Number.parseInt(digit)] || digit)
.join("")
}
// Gregorian month names in Bangla
const GREGORIAN_MONTHS_IN_BANGLA = [
"জানুয়ারি",
"ফেব্রুয়ারি",
"মার্চ",
"এপ্রিল",
"মে",
"জুন",
"জুলাই",
"আগস্ট",
"সেপ্টেম্বর",
"অক্টোবর",
"নভেম্বর",
"ডিসেম্বর",
]
/**
* Format a Gregorian date in Bangla language
* @param dateString Date string (e.g., "2023-05-14" or "2023-05-14T10:30:00Z")
* @param format Format option for the output
* @returns Formatted Gregorian date in Bangla language
*/
export const formatGregorianToBangla = (dateString: string, format: BanglaDateFormat = "medium"): string => {
// Parse the date string
const date = new Date(dateString)
// Check if the date is valid
if (isNaN(date.getTime())) {
throw new Error(`Invalid date string: ${dateString}`)
}
const day = date.getDate()
const month = date.getMonth() // 0-11
const year = date.getFullYear()
// Convert to Bangla numerals
const banglaDay = toBanglaNumerals(day)
const banglaYear = toBanglaNumerals(year)
const banglaMonthName = GREGORIAN_MONTHS_IN_BANGLA[month]
// Format based on the requested format
if (format === "full") {
const weekday = getBanglaWeekday(date)
return `${weekday}, ${banglaDay} ${banglaMonthName}, ${banglaYear}`
} else if (format === "short") {
return `${banglaDay}/${toBanglaNumerals(month + 1)}/${banglaYear}`
} else {
// medium format (default)
return `${banglaDay} ${banglaMonthName}, ${banglaYear}`
}
}
/**
* 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
*/
const formatBanglaDateString = (
banglaDate: BanglaDate,
format: BanglaDateFormat = "medium",
customFormat?: string,
): string => {
const { date, month, year, monthName, season } = banglaDate
const banglaDateNum = toBanglaNumerals(date)
const banglaYear = toBanglaNumerals(year)
if (format === "full") {
return `${banglaDateNum} ${monthName} ${banglaYear} (${season})`
} else if (format === "short") {
return `${banglaDateNum}/${toBanglaNumerals(month)}/${banglaYear}`
} else if (format === "custom" && customFormat) {
// Handle custom format (placeholder for future implementation)
// For now, return medium format
return `${banglaDateNum} ${monthName} ${banglaYear}`
} else {
// medium format
return `${banglaDateNum} ${monthName} ${banglaYear}`
}
}
/**
* Convert a date string to a Bangla calendar date string
* @param dateString Date string (e.g., "2023-05-14" or "2023-05-14T10:30:00Z")
* @param format Format option for the output
* @param customFormat Custom format string (for future implementation)
* @returns Formatted Bangla calendar date string
*/
export const convertToBanglaDate = (
dateString: string,
format: BanglaDateFormat = "medium",
customFormat?: string,
): string => {
// Parse the date string
const date = new Date(dateString)
// Check if the date is valid
if (isNaN(date.getTime())) {
throw new Error(`Invalid date string: ${dateString}`)
}
// Convert to Bangla date
const banglaDate = convertGregorianToBangla(date)
// Format and return
return formatBanglaDateString(banglaDate, format, customFormat)
}
/**
* Get detailed Bangla calendar information from a date string
* @param dateString Date string (e.g., "2023-05-14" or "2023-05-14T10:30:00Z")
* @param format Format option for the formatted output
* @param customFormat Custom format string (for future implementation)
* @returns Object containing formatted string and Bangla date details
*/
export const getBanglaDateDetails = (
dateString: string,
format: BanglaDateFormat = "medium",
customFormat?: string,
): { formatted: string; details: BanglaDate } => {
// Parse the date string
const date = new Date(dateString)
// Check if the date is valid
if (isNaN(date.getTime())) {
throw new Error(`Invalid date string: ${dateString}`)
}
// Convert to Bangla date
const banglaDate = convertGregorianToBangla(date)
// Format the date
const formatted = formatBanglaDateString(banglaDate, format, customFormat)
// Return both the formatted string and the details
return {
formatted,
details: banglaDate,
}
}
/**
* Get the Bangla weekday name for a given date
* @param date JavaScript Date object
* @returns Bangla weekday name
*/
const getBanglaWeekday = (date: Date): string => {
const day = date.getDay()
return BANGLA_WEEKDAYS[day]
}