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

JavaScript:无需库从fa-IR地区日期字符串创建Date对象

问题解决思路

JavaScript 原生 Date 对象本质基于公历时间戳,没有直接通过非公历日期字符串+地区参数构造对象的API,必须先将伊朗历(波斯历)日期转换为公历日期,再创建 Date 对象。我们可以利用原生 Intl.DateTimeFormat 支持波斯历日历的特性,通过匹配逻辑完成转换。


代码实现

// 目标伊朗历日期字符串
const dt = '1401/01/01';
// 地区设置
const locale = 'fa-IR';

// 拆分日期字符串,提取年、月、日数值
const [persianYear, persianMonth, persianDay] = dt.split('/').map(Number);

// 伊朗历转公历Date对象的函数
function convertPersianToDate(pYear, pMonth, pDay) {
  // 初始化起始公历日期(用当前年份附近的日期可加快匹配速度)
  let date = new Date();
  // 创建波斯历格式化器,指定日历类型为persian
  const formatter = new Intl.DateTimeFormat(locale, {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    calendar: 'persian'
  });

  while (true) {
    // 将当前公历日期格式化为波斯历的各个部分
    const parts = formatter.formatToParts(date);
    const formattedYear = parseInt(parts.find(part => part.type === 'year').value);
    const formattedMonth = parseInt(parts.find(part => part.type === 'month').value);
    const formattedDay = parseInt(parts.find(part => part.type === 'day').value);

    // 匹配到目标伊朗历日期,返回对应的Date对象
    if (formattedYear === pYear && formattedMonth === pMonth && formattedDay === pDay) {
      return new Date(date);
    }

    // 根据匹配结果调整公历日期,缩小范围
    if (formattedYear < pYear) {
      date.setFullYear(date.getFullYear() + 1);
    } else if (formattedYear > pYear) {
      date.setFullYear(date.getFullYear() - 1);
    } else if (formattedMonth < pMonth) {
      date.setMonth(date.getMonth() + 1);
    } else if (formattedMonth > pMonth) {
      date.setMonth(date.getMonth() - 1);
    } else if (formattedDay < pDay) {
      date.setDate(date.getDate() + 1);
    } else {
      date.setDate(date.getDate() - 1);
    }
  }
}

// 执行转换,得到目标Date对象
const targetDate = convertPersianToDate(persianYear, persianMonth, persianDay);
console.log(targetDate);

补充说明

  1. 该方法依赖原生 Intl.DateTimeFormat API,无需第三方库,支持所有现代浏览器及 Node.js v10+
  2. 转换后的 Date 对象是标准公历时间戳,可直接使用原生 Date 的所有方法
  3. 注意时区差异:伊朗时区为 UTC+3:30,转换后的 Date 对象会根据运行环境的时区显示,若需统一时区可额外处理

内容的提问来源于stack exchange,提问作者shahrooz bazrafshan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:55:29