如何使用jQuery将UNIX时间戳转换为Jalali日历日期并在标签显示
jQuery 实现 Unix 时间戳转 Jalali 日期渲染方案
实现逻辑
整体流程分3部分:
- 把Unix时间戳存在标签的自定义
data-timestamp属性上,和渲染逻辑解耦 - 内置公历转Jalali(波斯历)的核心算法,不需要额外引入第三方库
- 页面加载完成后,jQuery遍历所有带时间戳属性的标签,格式化后插入到标签内部,输出严格匹配
YYYY/MM/DD HH:mm:ss格式
完整实现代码
1. HTML 结构示例
时间戳直接写在data-timestamp属性上,给需要渲染日期的标签加统一的class方便选择:
<span class="persian-date" data-timestamp="1623940540"></span> <p class="persian-date" data-timestamp="1672531200"></p>
注意:默认示例里的时间戳是秒级Unix时间戳,如果你存的是毫秒级,后面JS代码里去掉
* 1000的换算逻辑即可。
2. JS 逻辑(依赖jQuery)
把下面代码放在页面jQuery引入之后即可:
// 公历转Jalali核心算法 function gregorianToJalali(gy, gm, gd) { let g_d_m = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]; let jy = (gy <= 1600) ? 0 : 979; gy = (gy <= 1600) ? gy - 621 : gy - 1600; let gy2 = (gm > 2) ? (gy + 1) : gy; let days = (365 * gy) + (Math.floor((gy2 + 3) / 4)) - (Math.floor((gy2 + 99) / 100)) + (Math.floor((gy2 + 399) / 400)) - 80 + gd + g_d_m[gm - 1]; jy += 33 * (Math.floor(days / 12053)); days %= 12053; jy += 4 * (Math.floor(days / 1461)); days %= 1461; if (days > 365) { jy += Math.floor((days - 1) / 365); days = (days - 1) % 365; } let jm = (days < 186) ? 1 + Math.floor(days / 31) : 7 + Math.floor((days - 186) / 30); let jd = 1 + ((days < 186) ? (days % 31) : ((days - 186) % 30)); return [jy, jm, jd]; } // 补零工具,保证月/日/时/分/秒都是两位 function padZero(num) { return num < 10 ? '0' + num : num; } // 页面加载完成后执行渲染 $(function() { // 遍历所有带persian-date类的标签 $('.persian-date').each(function() { const $el = $(this); // 读取标签上的时间戳 const timestamp = parseInt($el.data('timestamp'), 10); if (!timestamp) return; // 时间戳转公历日期对象,秒级时间戳乘1000转毫秒 const date = new Date(timestamp * 1000); // 拆分公历年月日 const gYear = date.getFullYear(); const gMonth = date.getMonth() + 1; const gDay = date.getDate(); // 转Jalali年月日 const [jYear, jMonth, jDay] = gregorianToJalali(gYear, gMonth, gDay); // 取时分秒 const hours = padZero(date.getHours()); const minutes = padZero(date.getMinutes()); const seconds = padZero(date.getSeconds()); // 拼接成要求的格式 1400/03/18 18:35:40 const formatted = `${jYear}/${padZero(jMonth)}/${padZero(jDay)} ${hours}:${minutes}:${seconds}`; // 插入到标签内部 $el.text(formatted); }); });
效果验证
比如时间戳1623940540对应公历2021-06-17 18:35:40,转换后输出的Jalali日期正好是1400/03/18 18:35:40,完全匹配要求的格式。
内容的提问来源于stack exchange,提问作者Mahan Parsa
相关产品推荐
相关产品推荐

