bengali-calendar
Version:
বাংলা তারিখ, সময়, মাস ও সপ্তাহের দিনের নাম সহ Bangla Calendar and Time Utility with TypeScript support.
231 lines (230 loc) • 8.25 kB
JavaScript
const banglaDigits = ["০", "১", "২", "৩", "৪", "৫", "৬", "৭", "৮", "৯"];
const banglaMonths = [
"জানুয়ারি",
"ফেব্রুয়ারি",
"মার্চ",
"এপ্রিল",
"মে",
"জুন",
"জুলাই",
"আগস্ট",
"সেপ্টেম্বর",
"অক্টোবর",
"নভেম্বর",
"ডিসেম্বর",
];
const banglaWeekdays = [
"রবিবার",
"সোমবার",
"মঙ্গলবার",
"বুধবার",
"বৃহস্পতিবার",
"শুক্রবার",
"শনিবার",
];
const banglaMonthsBengaliCalendar = [
"বৈশাখ",
"জ্যৈষ্ঠ",
"আষাঢ়",
"শ্রাবণ",
"ভাদ্র",
"আশ্বিন",
"কার্তিক",
"অগ্রহায়ণ",
"পৌষ",
"মাঘ",
"ফাল্গুন",
"চৈত্র",
];
const engDigits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
export function toBanglaDigits(input) {
return input
.toString()
.split("")
.map((char) => {
if (char >= "0" && char <= "9") {
return banglaDigits[parseInt(char)];
}
return char;
})
.join("");
}
export function toEnglishDigits(input) {
return input
.split("")
.map((char) => {
const index = banglaDigits.indexOf(char);
if (index !== -1)
return engDigits[index];
return char;
})
.join("");
}
export function getBanglaDate(date) {
const banglaYearStart = new Date(date.getFullYear(), 3, 14);
let banglaYear = date.getFullYear() - 593;
if (date < banglaYearStart) {
banglaYear--;
banglaYearStart.setFullYear(banglaYearStart.getFullYear() - 1);
}
const diffDays = Math.floor((date.getTime() - banglaYearStart.getTime()) / (1000 * 60 * 60 * 24));
const banglaMonthDays = [31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29, 30];
let monthIndex = 0;
let remainingDays = diffDays;
while (remainingDays >= banglaMonthDays[monthIndex]) {
remainingDays -= banglaMonthDays[monthIndex];
monthIndex++;
}
const banglaDay = toBanglaDigits(remainingDays + 1);
const banglaMonth = banglaMonthsBengaliCalendar[monthIndex % 12];
const banglaYearStr = toBanglaDigits(banglaYear);
return { day: banglaDay, month: banglaMonth, year: banglaYearStr };
}
export function formatBanglaDate(date) {
const dayName = banglaWeekdays[date.getDay()];
const { day, month, year } = getBanglaDate(date);
return `${dayName}, ${day} ${month} ${year}`;
}
export function formatBanglaTime(date, includeSeconds = true) {
const hours = toBanglaDigits(date.getHours());
const minutes = toBanglaDigits(date.getMinutes());
const seconds = toBanglaDigits(date.getSeconds());
return includeSeconds
? `${hours}:${minutes}:${seconds}`
: `${hours}:${minutes}`;
}
export function formatBanglaTime12(date, includeSeconds = true) {
let hours = date.getHours();
const minutes = toBanglaDigits(date.getMinutes());
const seconds = toBanglaDigits(date.getSeconds());
const ampm = hours >= 12 ? "অপরাহ্ন" : "পুর্বাহ্ন";
hours = hours % 12;
if (hours === 0)
hours = 12;
const banglaHours = toBanglaDigits(hours);
return includeSeconds
? `${banglaHours}:${minutes}:${seconds} ${ampm}`
: `${banglaHours}:${minutes} ${ampm}`;
}
export function getCurrentBanglaDateTime() {
const now = new Date();
return {
banglaDate: formatBanglaDate(now),
banglaTime: formatBanglaTime(now),
};
}
export function getBanglaWeekNumber(date) {
const oneJan = new Date(date.getFullYear(), 0, 1);
const numberOfDays = Math.floor((date.getTime() - oneJan.getTime()) / (24 * 60 * 60 * 1000));
const weekNumber = Math.ceil((date.getDay() + 1 + numberOfDays) / 7);
return toBanglaDigits(weekNumber);
}
export function getBanglaMonthFromEnglish(date) {
const monthIndex = date.getMonth();
const mapping = {
0: 8,
1: 9,
2: 10,
3: 11,
4: 0,
5: 1,
6: 2,
7: 3,
8: 4,
9: 5,
10: 6,
11: 7,
};
return banglaMonthsBengaliCalendar[mapping[monthIndex]];
}
export function getDayName(date) {
return banglaWeekdays[date.getDay()];
}
export function getEnglishMonthName(date) {
const englishMonths = [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December",
];
return englishMonths[date.getMonth()];
}
export function getBanglaMonthName(date) {
return getBanglaDate(date).month;
}
export function formatBanglaDateWithBanglaMonth(date) {
const { day, month } = getBanglaDate(date);
return `${day} ${month}`;
}
export function formatFullBanglaDateTime(date, includeSeconds = true) {
const dayName = banglaWeekdays[date.getDay()];
const { day, month, year } = getBanglaDate(date);
const time = formatBanglaTime(date, includeSeconds);
return `${dayName}, ${day} ${month} ${year}, সময়: ${time}`;
}
export function getBanglEnglishFullDateTimeInfo(date = new Date()) {
const banglaDateInfo = getBanglaDate(date);
const banglaDayName = banglaWeekdays[date.getDay()];
const banglaTime24 = formatBanglaTime(date);
const banglaTime12 = formatBanglaTime12(date);
const englishDay = date.getDate();
const englishMonthName = getEnglishMonthName(date);
const englishDayName = date.toLocaleString("en-US", { weekday: "long" });
const englishYear = date.getFullYear();
const englishTime24 = date.toLocaleTimeString("en-GB");
const englishTime12 = date.toLocaleTimeString("en-US");
return {
bangla: {
day: banglaDateInfo.day,
month: banglaDateInfo.month,
year: banglaDateInfo.year,
weekday: banglaDayName,
time24: banglaTime24,
time12: banglaTime12,
},
english: {
day: englishDay,
month: englishMonthName,
year: englishYear,
weekday: englishDayName,
time24: englishTime24,
time12: englishTime12,
},
};
}
export function formatFullDateTimeDual(date = new Date(), includeSeconds = false) {
const banglaDateInfo = getBanglaDate(date);
const banglaDayName = banglaWeekdays[date.getDay()];
let banglaHoursNum = date.getHours();
const banglaAmPm = banglaHoursNum >= 12 ? "অপরাহ্ন" : "পুর্বাহ্ন";
banglaHoursNum = banglaHoursNum % 12;
if (banglaHoursNum === 0)
banglaHoursNum = 12;
const banglaHours = toBanglaDigits(banglaHoursNum);
const banglaMinutes = toBanglaDigits(date.getMinutes());
const banglaSeconds = toBanglaDigits(date.getSeconds());
const banglaTime = includeSeconds
? `${banglaHours}:${banglaMinutes}:${banglaSeconds} ${banglaAmPm}`
: `${banglaHours}:${banglaMinutes} ${banglaAmPm}`;
const englishDayName = date.toLocaleString("en-US", { weekday: "long" });
const englishDay = date.getDate();
const englishMonthName = getEnglishMonthName(date);
const englishYear = date.getFullYear();
const englishHoursNum = date.getHours() % 12 || 12;
const englishHours = englishHoursNum.toString().padStart(2, "0");
const englishMinutes = date.getMinutes().toString().padStart(2, "0");
const englishSeconds = date.getSeconds().toString().padStart(2, "0");
const englishAmPm = date.getHours() >= 12 ? "PM" : "AM";
const englishTime = includeSeconds
? `${englishHours}:${englishMinutes}:${englishSeconds} ${englishAmPm}`
: `${englishHours}:${englishMinutes} ${englishAmPm}`;
return `${banglaDayName}, ${banglaDateInfo.day} ${banglaDateInfo.month} ${banglaDateInfo.year} (${banglaTime}) | ${englishDayName}, ${englishDay} ${englishMonthName} ${englishYear} (${englishTime})`;
}