前端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)}`;

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

相关推荐
C+-C资深大佬9 小时前
C++类型判断
开发语言·c++
摘星编程10 小时前
在OpenHarmony上用React Native:ActionSheet确认删除
javascript·react native·react.js
2501_9445215910 小时前
Flutter for OpenHarmony 微动漫App实战:推荐动漫实现
android·开发语言·前端·javascript·flutter·ecmascript
不绝19110 小时前
C#进阶:委托
开发语言·c#
喜欢喝果茶.10 小时前
跨.cs 文件传值(C#)
开发语言·c#
zmzb010310 小时前
C++课后习题训练记录Day74
开发语言·c++
小冷coding10 小时前
【Java】Dubbo 与 OpenFeign 的核心区别
java·开发语言·dubbo
Coder_Boy_10 小时前
基于SpringAI的在线考试系统-智能考试系统-学习分析模块
java·开发语言·数据库·spring boot·ddd·tdd
2401_8948281210 小时前
从原理到实战:随机森林算法全解析(附 Python 完整代码)
开发语言·python·算法·随机森林
玄同76510 小时前
Python「焚诀」:吞噬所有语法糖的终极修炼手册
开发语言·数据库·人工智能·python·postgresql·自然语言处理·nlp