如何将JavaScript的new Date()转换为fa-IR波斯历并适配倒计时代码
波斯历(fa-IR)倒计时适配方案
实现说明
原生JavaScript的Date对象不支持直接解析波斯语日期格式的字符串,我们通过两步实现需求:
- 提前定义波斯历12个月份的波斯语名称到月份数字的映射表
- 实现波斯历日期转标准Date对象的工具函数,兼容原有倒计时逻辑无需大幅修改
完整适配代码
HTML 代码
<p id="demo"></p>
CSS 代码
(和原有代码一致,无需修改)
p { text-align: center; font-size: 60px; margin-top: 0px; }
JS 代码
// 波斯历月份名称映射表:波斯语名称 => 月份数字(1-12) const persianMonthMap = { 'فروردین': 1, 'اردیبهشت': 2, 'خرداد': 3, 'تیر': 4, 'مرداد': 5, 'شهریور': 6, 'مهر': 7, 'آبان': 8, 'آذر': 9, 'دی': 10, 'بهمن': 11, 'اسفند': 12 } // 波斯历日期字符串转标准Date对象工具函数 function parsePersianDate(persianDateStr) { // 拆分日期字符串:格式示例 "شهریور 5, 1400 15:37:25" const [monthDayPart, restPart] = persianDateStr.split(','); const [monthName, day] = monthDayPart.trim().split(' '); const [persianYear, timeStr] = restPart.trim().split(' '); const [hour, minute, second] = timeStr.split(':').map(Number); const persianMonth = persianMonthMap[monthName]; const pYear = Number(persianYear); const pDay = Number(day); // 转换波斯历日期为公历Date对象 let date = new Date(); // 初始化年份为对应公历大致范围:波斯历年+621为对应公历年近似值 date.setFullYear(pYear + 621); date.setHours(hour, minute, second, 0); // 校准日期直到匹配波斯历目标日期 for (let i = 0; i < 400; i++) { const currentPersianDate = date.toLocaleDateString('fa-IR-u-nu-latn', { calendar: 'persian' }).split('/'); const currentY = Number(currentPersianDate[0]); const currentM = Number(currentPersianDate[1]); const currentD = Number(currentPersianDate[2]); if (currentY === pYear && currentM === persianMonth && currentD === pDay) { return date; } date.setDate(date.getDate() + 1); } throw new Error('无效的波斯历日期格式'); } // 替换原日期定义,直接使用波斯语日期字符串即可 var countDownDate = parsePersianDate("شهریور 5, 1400 15:37:25").getTime(); // 原有倒计时逻辑无需修改 var x = setInterval(function() { var now = new Date().getTime(); var distance = countDownDate - now; var days = Math.floor(distance / (1000 * 60 * 60 * 24)); var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)); var seconds = Math.floor((distance % (1000 * 60)) / 1000); // 如果需要显示波斯语数字,把对应的数字调用.toLocaleString('fa-IR')即可,示例: // days = days.toLocaleString('fa-IR') document.getElementById("demo").innerHTML = days + "d " + hours + "h " + minutes + "m " + seconds + "s "; if (distance < 0) { clearInterval(x); document.getElementById("demo").innerHTML = "已过期"; } }, 1000);
额外说明
如果需要将倒计时显示的数字也转换为波斯语格式,只需要取消代码中对应注释,将天、时、分、秒的数值调用.toLocaleString('fa-IR')转换即可。
内容的提问来源于stack exchange,提问作者mahdiros
相关产品推荐
相关产品推荐

