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);
补充说明
- 该方法依赖原生
Intl.DateTimeFormatAPI,无需第三方库,支持所有现代浏览器及 Node.js v10+ - 转换后的
Date对象是标准公历时间戳,可直接使用原生 Date 的所有方法 - 注意时区差异:伊朗时区为 UTC+3:30,转换后的 Date 对象会根据运行环境的时区显示,若需统一时区可额外处理
内容的提问来源于stack exchange,提问作者shahrooz bazrafshan
相关产品推荐
相关产品推荐

