JavaScript在处理日期相关逻辑时,最常见的需求之一就是获取当天日期以及前一天日期。尤其在数据统计、日志分析、报表生成、接口参数处理等场景中,这类操作几乎是基础能力。JavaScript 提供的原生 Date 对象虽然功能完整,但如果不理解其底层机制,很容易在时区、月份边界和格式化输出上踩坑。
一、JavaScript日期对象的基本原理
JavaScript中的日期对象基于时间戳(Unix Time),本质是从1970年1月1日UTC开始计算的毫秒数。
JavaScriptconst now = new Date();
Date对象默认使用当前系统时区,因此在不同环境中可能出现显示差异。
二、获取当天日期的标准写法
获取当天日期通常分为两种需求:
仅获取日期对象
获取格式化后的字符串
方式一:直接获取当前日期对象
JavaScriptconst today = new Date();
方式二:格式化为 YYYY-MM-DD
JavaScriptconst date = new Date();
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const todayStr = `${year}-${month}-${day}`;
这种方式适用于接口参数传递或数据库查询。
三、获取前一天日期的核心方法
前一天日期的计算本质是时间戳减法,而不是简单的“日 - 1”。
JavaScriptconst date = new Date();
date.setDate(date.getDate() - 1);
格式化前一天日期
JavaScriptconst date = new Date();
date.setDate(date.getDate() - 1);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const yesterdayStr = `${year}-${month}-${day}`;
这种写法会自动处理跨月、跨年情况。
四、推荐封装:通用日期获取函数
在实际项目中,建议封装通用方法,提高复用性。
JavaScriptfunction formatDate(date) {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
}
const today = formatDate(new Date());
const yesterday = formatDate(
new Date(new Date().setDate(new Date().getDate() - 1))
);
这种封装方式适用于中大型项目的统一日期管理。
五、使用时间戳方式获取前一天(更稳定)
相比直接操作Date对象,时间戳方式更直观:
JavaScriptconst now = Date.now();
const oneDay = 24 * 60 * 60 * 1000;
const today = new Date(now);
const yesterday = new Date(now - oneDay);
优点:
逻辑清晰
避免链式Date修改带来的副作用
更适合高频计算场景
六、避免常见坑:时区与跨天问题
日期处理最容易出问题的地方是时区。
例如:
UTC时间与本地时间差异
夏令时变化
服务器与前端时间不一致
建议:
统一使用本地时间或UTC时间
后端返回统一时间戳
前端仅做格式化展示
七、处理跨月与跨年边界
JavaScript Date对象会自动处理边界:
JavaScriptconst date = new Date('2025-03-01');
date.setDate(date.getDate() - 1);
console.log(date); // 2025-02-28
无需手动判断月份天数,这是Date API的优势之一。
八、实际业务中的应用场景
获取当天及前一天日期通常用于:
数据报表对比
每日统计任务
接口参数过滤
缓存Key生成
日志分区查询
例如:
JavaScriptconst today = formatDate(new Date());
const yesterday = formatDate(new Date(Date.now() - 86400000));
fetch(`/api/stat?today=${today}&yesterday=${yesterday}`);
九、进阶方案:使用第三方日期库
在复杂业务中,可以使用:
dayjs
moment.js(已逐渐被替代)
以dayjs为例:
JavaScriptimport dayjs from 'dayjs';
const today = dayjs().format('YYYY-MM-DD');
const yesterday = dayjs().subtract(1, 'day').format('YYYY-MM-DD');
可读性更强,维护成本更低。
十、最佳实践总结
优先使用时间戳进行日期计算
避免直接修改原Date对象导致副作用
统一日期格式化逻辑
跨项目建议封装工具函数
复杂场景使用成熟日期库
合理处理日期逻辑可以显著降低线上bug概率,尤其在数据驱动型系统中,这类基础能力的稳定性直接影响整体业务质量。