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

Laravel项目中persianDate的edate1返回NaN/NaN/NaN的原因及解决方法

问题

我在Laravel项目中编写了如下JavaScript代码片段:

$('#deadline').change(function() {
    const dval =parseInt($('#deadline').val());
    const startdate=document.getElementById("startdate").value;
    const startdateToEnglish= startdate.toEnglishDigit();
    console.log("startdate: "+startdate+"  interval: "+dval);
    var inputF = document.getElementById("enddate"); 
    edate=new persianDate().format();
    edate1=new persianDate([startdateToEnglish]).add('days', dval).format('YYYY/MM/DD');
    console.log("startdateToEnglish: "+startdateToEnglish);
    edate2=new persianDate([1402,08,01]).add('days', dval).format('YYYY/MM/DD');
    inputF.value = edate; 

   console.log("edate1:  "+edate1+"     edate2:   "+edate2 );
});

控制台输出如下:

startdate: ۱۴۰۲,۰۸,۱  interval: 1
startdateToEnglish: 1402,08,01
edate1:  NaN/NaN/NaN     edate2:   ۱۴۰۲/۰۸/۰۲

edate1与edate2逻辑类似,为何edate1的值为NaN/NaN/NaN?如何让edate1得到与edate2一致的输出?

原因与解决方案

原因

创建edate1时,你传给persianDate的是包含字符串"1402,08,01"的数组,persianDate无法解析这种格式的参数。而edate2传入的是数字类型的年、月、日组成的数组[1402,08,01],完全符合persianDate的构造要求,所以能正常计算。

解决方案

需要把startdateToEnglish按逗号分割,转换成数字数组后再传给persianDate:

// 分割字符串并转为数字数组
const dateParts = startdateToEnglish.split(',').map(part => parseInt(part, 10));
// 使用数字数组创建persianDate实例
edate1 = new persianDate(dateParts).add('days', dval).format('YYYY/MM/DD');

修改后的完整代码:

$('#deadline').change(function() {
    const dval = parseInt($('#deadline').val());
    const startdate = document.getElementById("startdate").value;
    const startdateToEnglish = startdate.toEnglishDigit();
    console.log("startdate: "+startdate+"  interval: "+dval);
    var inputF = document.getElementById("enddate"); 
    edate = new persianDate().format();
    
    // 修复edate1的创建逻辑
    const dateParts = startdateToEnglish.split(',').map(part => parseInt(part, 10));
    edate1 = new persianDate(dateParts).add('days', dval).format('YYYY/MM/DD');
    
    console.log("startdateToEnglish: "+startdateToEnglish);
    edate2 = new persianDate([1402,08,01]).add('days', dval).format('YYYY/MM/DD');
    inputF.value = edate; 

    console.log("edate1:  "+edate1+"     edate2:   "+edate2 );
});

修改后edate1就能和edate2一样正常输出计算后的日期。

内容的提问来源于stack exchange,提问作者jason bikari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 15:23:11