You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:36:01