前端js日期计算跨月导致的错误

一、页面显示异常

该bug源于一个简单的报表展示需求,在日期选择框中默认显示两天前的日期。我看了看同事留下的代码,觉得挺简单,直接进行复用:

java 复制代码
function curDt() : void {
    var date : Date = new Date();
    var y : number = date.getFullYear();
    var m : number = date.getMonth()+1;
    var d : number = date.getDate() - 2;  // 就是这里!
    var startT : string = y+"-"+(m<10?('0'+m):m)+"-"+(d<10?('0'+d):d);
}

需求上线半个月都没有出现什么问题,直到12月1号,业务反馈前端日期展示变成了:

2025-12-0-1

一看才发现,不止我这一个地方出错了,其余采用这种计算逻辑的页面日期也全乱了。

二、错误分析

假设今天是 2025年12月1日,那么date.getDate() = 1,date.getDate() - 2 = -1,而三元运算符处理负数 (d < 10 ? ('0' + d) : d)-1 < 10 成立,所以结果是 '0' + (-1) = '0-1',最后再拼接年月就变成了2025-12-0-1

三、修复方案

使用js内置函数,setDate() 方法,Date对象会自动处理跨月、跨年的边界情况,先date - 2, 再计算年、月、日。

java 复制代码
// 获取两天前的正确日期
    const date = new Date();
    date.setDate(date.getDate() - 2); // 自动处理跨月跨年
    
    const y = date.getFullYear();
    const m = date.getMonth() + 1;
    const d = date.getDate();
    
    // 格式化日期
    const format = (num: number) => num < 10 ? '0' + num : num;
    const startT = `${y}-${format(m)}-${format(d)}`;

其实这也是一种值得注意的编码规范,就是涉及时间计算的时候,能尽量使用内置函数就使用内置函数,自定义时间计算函数容易带来跨年和跨月问题。

相关推荐
窝子面10 小时前
手搓最简前后端协作-node
javascript·数据库
人邮异步社区11 小时前
怎么把C语言学到精通?
c语言·开发语言
qetfw11 小时前
MXU:Tauri 2 + React 的 MaaFramework 跨平台 GUI 源码
前端·python·react.js·前端框架·开源项目·效率工具
甲维斯11 小时前
我要开始吹牛逼了!Kimi K3 “宇宙无敌”!
前端·人工智能
a11177611 小时前
微光小屋-前端养成小游戏 开源项目
前端
kyriewen11 小时前
我让AI给前端项目做了一次完整的Code Review——它和人类的差距,比我想的大得多
前端·javascript·ai编程
张鑫旭11 小时前
快速过下我2026年上半年的前端学了些啥
前端
心平气和量大福大11 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai11 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang