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

JavaScript日期计算异常排查:基于分类与保质期生成预期日期失败

问题排查与修正

前端返回数据

const response = { Lakban: "Merah", Plant: "K103", Kategori: "M2", Jumlah: 103 }

MongoDB查询数据

const monthReturnDB = "November"
const shelfLifeDB = 6

现有代码问题分析

你当前的代码存在以下几个明确错误,导致无法得到预期日期结果:

  • 变量名错误:误用了不存在的Dates对象,正确的日期构造函数是Date,需写成new Date().getFullYear(),而非Dates.getFullYear()。
  • 日期格式拼接错误:生成的value字符串缺少年份前的斜杠,会出现1/112023这类无效格式,无法被Date构造函数正确解析,应拼接为1/11/2023的标准格式。
  • 变量不匹配:后续代码使用了未定义的valueDB变量,需替换为前面生成的value。
  • 保质期数值错误:代码中固定加11个月,但实际应使用shelfLifeDB的数值(6个月)计算到期日期。
  • 日期构造兼容性问题:直接用字符串构造Date存在跨浏览器兼容性风险,建议使用Date的参数形式创建日期对象。

修正后的代码

// 获取月份数字的函数
const getMonth = (monthStr) => {
    return new Date(`${monthStr}-1-01`).getMonth() + 1;
};

// 生成基础日期
let value;
const currentYear = new Date().getFullYear();
const monthNum = getMonth(monthReturnDB);

if (response.Kategori === "M1") {
    value = `1/${monthNum}/${currentYear}`;
} else {
    value = `1/${monthNum}/${currentYear - 1}`;
}

// 计算到期日期
// 拆分日期字段,用参数构造Date避免解析问题
const [day, month, year] = value.split('/').map(Number);
const end = new Date(year, month - 1, day); // Date的月份参数是0基(0代表1月)
end.setMonth(end.getMonth() + shelfLifeDB); // 使用数据库中的保质期数值

const curr = new Date();
console.log(curr);
console.log(end.toLocaleString('en-US'), value);

关键说明

  • Date构造函数的月份参数为0基,所以需要将获取到的月份数字减1后传入。
  • 通过拆分字符串构造Date,规避了不同浏览器对日期字符串解析的差异问题。
  • 替换固定的11个月为shelfLifeDB,确保使用正确的保质期数值计算到期日。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 06:15:45