导读:本期聚焦于坚哥创作的《JavaScript中如何操作日期?Date对象常见方法有哪些》,敬请观看详情。在JavaScript开发中,日期和时间的处理是常见需求,Date对象作为原生提供的日期处理工具,掌握其使用方法能高效解决各类日期相关问题。本文将详细介绍Date对象的创建方式,梳理getFullYear、getMonth、setDate等常用方法的用途和使用场景,同时讲解日期格式化、日期计算等实际操作技巧,帮助开发者快速掌握JavaScript日期操作的核心逻辑,避免常见的使用误区,提升日常开发效率。

JavaScript 中的 Date 对象是处理日期与时间的基础内置对象。它把日期时间抽象为可计算、可比较、可读取和可修改的结构,使开发者能够在业务脚本中完成时间戳转换、字段提取、日期偏移、格式输出等任务。理解 Date 对象的关键,不只是记住方法名,而是理解它背后的时间表示方式:Date 内部通常以毫秒数表示一个时刻,外部则通过一组 getset 方法暴露年、月、日、时、分、秒等字段。这样的设计让日期既能按业务字段展示,也能按数值进行运算和比较。

一、Date 对象的创建方式与初始化语义

Date 对象支持多种创建方式,不同参数形式对应不同的初始化逻辑。无参数创建用于获取当下系统时间,适合记录操作发生时刻;传入时间戳创建用于根据毫秒数还原一个时刻,适合传递时间值;传入日期字符串创建用于解析符合格式的字符串,适合处理输入或文本中的日期数据;传入年月日等参数创建用于精确指定各个字段,适合构造测试数据或生成固定时刻。

在这些创建方式中,参数化创建最容易产生误解,因为月份参数从 0 开始计数,0 代表第一个月,11 代表第十二月。日期参数表示当月第几天,小时、分钟、秒和毫秒则按常见范围取值。日期字符串创建虽然直观,但不同运行环境对字符串格式的支持程度可能不同,因此在跨平台场景下,需要格外注意解析结果是否符合预期。

  • 无参数创建:获取当下系统时间。
  • 传入时间戳:根据毫秒数创建对应日期。
  • 传入日期字符串:解析符合格式的日期字符串。
  • 传入年月日等参数:依次指定年、月、日、时、分、秒、毫秒。

示例展示了几种常见创建方式。示例中使用当下时间和标准时间纪元起点,便于理解不同参数如何影响最终结果。实际业务中,应根据数据来源选择最稳定的创建方式。

// 无参数创建,表示当下系统时间
const now = new Date();
console.log(now);

// 传入时间戳创建,0 表示标准时间纪元起点
const dateByTimestamp = new Date(0);
console.log(dateByTimestamp);

// 传入日期字符串创建,实际使用时应传入符合格式的字符串
const dateByString = new Date('');
console.log(dateByString);

// 传入年月日等参数创建,月份从0开始计数
const year = 0;
const month = 0;
const day = 1;
const hour = 0;
const minute = 0;
const dateByParams = new Date(year, month, day, hour, minute, 0, 0);
console.log(dateByParams);

二、Date 对象的读取方法与字段语义

Date 对象提供了一系列以 get 开头的方法,用于读取日期中的各个组成部分。这些方法不会改变原对象,只返回当下时刻对应的字段值。读取方法常用于展示、校验、统计和日志记录等场景,例如展示完整年月日时分秒、判断星期、计算时间差或生成报表标题。

在使用读取方法时,需要特别关注返回值范围。年份通常返回四位年份数值;月份返回 011,其中 0 代表第一个月;日期返回当月第几天;星期返回 06,其中 0 代表周日;小时、分钟、秒分别按对应范围返回;时间戳返回从标准时间纪元起点到该时刻的毫秒数。这些规则与日常表达略有差异,因此展示月份时通常需要加 1

方法名作用返回值说明
getFullYear()获取完整年份返回四位年份数值
getMonth()获取月份返回0到11,0代表第一个月,11代表第十二月
getDate()获取日期返回1到31的整数
getDay()获取星期返回0到6,0代表周日,6代表周六
getHours()获取小时返回0到23的整数
getMinutes()获取分钟返回0到59的整数
getSeconds()获取秒数返回0到59的整数
getTime()获取时间戳返回从标准时间纪元起点到该时刻的毫秒数

示例基于当下时间读取各个字段。通过对比 getMonth()getDay() 的返回值,可以更清楚地理解月份和星期在计数规则上的不同。

const date = new Date();
console.log('完整年份:', date.getFullYear());
console.log('月份:', date.getMonth() + 1);
console.log('当月日期:', date.getDate());
console.log('星期:', date.getDay());
console.log('小时:', date.getHours());
console.log('分钟:', date.getMinutes());
console.log('秒数:', date.getSeconds());
console.log('时间戳:', date.getTime());

三、Date 对象的设置方法与修改边界

除了读取字段,Date 对象还提供以 set 开头的方法,用于修改日期中的各个组成部分。设置方法会直接改变当下 Date 对象所表示的时刻,因此调用后原对象的值会发生变化。这类方法适合在已有时间基础上做偏移、修正或补全,例如把时间推进到下一天、调整小时、把某个字段设置为固定值等。

设置方法同样需要注意月份从 0 开始计数的规则。与读取方法类似,设置月份时传入 0 表示第一个月,传入 11 表示第十二月。此外,设置日期、月份或年份时,如果结果超出当下范围,Date 对象会按照日历规则进行进位或借位。例如设置日期超过当月最大天数时,会进入下一个月的对应日期;设置月份超过范围时,会进入下一年的对应月份。理解这些边界行为,可以避免在跨月、跨年场景中产生意外结果。

  • setFullYear(year, month, date):设置年份,可选设置月份和日期。
  • setMonth(month, date):设置月份,可选设置日期,月份同样从0开始。
  • setDate(date):设置当月日期。
  • setHours(hours, minutes, seconds, ms):设置小时,可选设置分、秒、毫秒。
  • setMinutes(minutes, seconds, ms):设置分钟,可选设置秒、毫秒。
  • setSeconds(seconds, ms):设置秒数,可选设置毫秒。
  • setTime(timestamp):通过时间戳设置日期。

示例演示了如何基于当下时间修改年份、月份、日期和小时。示例使用相对偏移,重点展示设置方法如何改变原对象。

const date = new Date();
console.log('原始日期:', date);

// 修改年份,使用相对偏移
date.setFullYear(date.getFullYear() + 1);
console.log('修改年份后:', date);

// 修改月份,参数从0开始
date.setMonth(date.getMonth() + 1);
console.log('修改月份后:', date);

// 修改当月日期,使用相对偏移
date.setDate(date.getDate() + 1);
console.log('修改日期后:', date);

// 修改小时,使用相对偏移
date.setHours(date.getHours() + 1);
console.log('修改小时后:', date);

四、常见日期操作:格式化、计算与比较

日期格式化、计算和比较是 Date 对象最常见的组合操作。它们通常不是孤立使用的,而是基于创建、读取和修改能力展开。理解这些组合操作,有助于把零散的时间字段转化为可展示、可运算、可判断的业务数据。

这些操作也体现了 Date 对象的核心价值:它不只是展示时间的容器,而是可以参与业务判断的数据结构。在实际逻辑中,格式化往往面向展示,计算往往面向时间窗口,比较往往面向顺序和有效性。

日期格式化

日期格式化是把 Date 对象中的字段按照业务需要的文本形式拼接出来。由于 Date 对象没有内置的统一格式化方法,开发者通常需要根据展示要求自行组合年、月、日、时、分、秒等字段。格式化函数适合封装复用,能够保证页面、日志、导出文件中的时间格式保持一致。

在实现格式化函数时,常见做法是先把各字段转换为字符串,并对不足两位的数值补零,再根据格式模板替换占位符。占位符可以使用 YYYY 表示年份,MM 表示月份,DD 表示日期,HH 表示小时,mm 表示分钟,ss 表示秒数。这样既能输出紧凑格式,也能输出适合阅读的自然语言格式。

function formatDate(date, formatStr) {
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    const hours = String(date.getHours()).padStart(2, '0');
    const minutes = String(date.getMinutes()).padStart(2, '0');
    const seconds = String(date.getSeconds()).padStart(2, '0');

    return formatStr
        .replace('YYYY', year)
        .replace('MM', month)
        .replace('DD', day)
        .replace('HH', hours)
        .replace('mm', minutes)
        .replace('ss', seconds);
}

const now = new Date();
console.log(formatDate(now, 'YYYY-MM-DD HH:mm:ss'));
console.log(formatDate(now, 'YYYY年MM月DD日'));

日期计算

日期计算通常用于获取未来或过去的某个时刻,例如计算三天后的日期、一个月后的日期或某个时间窗口。实现方式主要有两种:一种是通过 setDate 等字段方法直接修改日期,适合按天、月、年等日历单位进行偏移;另一种是通过时间戳计算,适合按毫秒数进行精确偏移。

使用字段方法时,Date 对象会按照日历规则处理跨月、跨年等边界情况。使用时间戳方法时,需要把天数、小时数等单位换算成毫秒数。一天对应的毫秒数为 24 * 60 * 60 * 1000,因此计算若干天后的时刻,可以在 Date.now() 返回的时间戳上加上相应毫秒数,再创建新的 Date 对象。

const now = new Date();

// 方法一:通过 setDate 计算
now.setDate(now.getDate() + 3);
console.log('3天后的日期:', now);

// 方法二:通过时间戳计算,一天毫秒数为 24 * 60 * 60 * 1000
const oneDayInMs = 24 * 60 * 60 * 1000;
const threeDaysLater = new Date(Date.now() + 3 * oneDayInMs);
console.log('3天后的日期:', threeDaysLater);

日期比较

日期比较用于判断两个时刻的先后关系,常见于排序、筛选、有效期校验和任务调度等场景。由于 Date 对象本质上表示一个时刻,因此既可以转换为时间戳后比较,也可以直接参与比较运算。转换为时间戳后,比较逻辑更加直观,便于阅读和调试。

直接比较 Date 对象时,运行环境会将其转换为数值形式参与判断。对于大多数场景,两种方式都能得到一致结果。若需要判断两个时刻是否完全相同,建议使用 getTime() 返回的毫秒数进行严格比较,避免因为对象引用不同而产生误解。

const date1 = new Date(Date.now());
const date2 = new Date(Date.now() + 1000);

// 方法一:比较时间戳
console.log(date1.getTime() < date2.getTime());

// 方法二:直接比较 Date 对象
console.log(date1 < date2);
console.log(date1 > date2);
console.log(date1.getTime() === date2.getTime());

五、使用 Date 对象时的注意事项与稳定实践

使用 Date 对象时,有一些细节会直接影响结果稳定性。首先,月份从 0 开始计数,使用 getMonth()setMonth() 时需要特别注意与日常月份表达之间的转换。其次,不同运行环境对日期字符串的解析规则可能存在差异,建议优先使用时间戳或年月日参数形式创建日期,减少因字符串格式不同导致的兼容性问题。

另外,getDay() 返回的是星期,0 代表周日,这一规则与其他字段并不完全一致,容易在展示或判断工作日时造成混淆。设置方法会直接改变原对象,如果需要保留原始日期,建议先复制日期对象再操作。复制 Date 对象的方式很简单,可以通过传入原对象的时间戳创建新对象,使两个对象表示相同时刻,但彼此独立。

  • 月份从0开始计数,使用 getMonth()setMonth() 时需要注意与日常表达之间的转换。
  • 不同运行环境对日期字符串的解析规则可能存在差异,建议优先使用时间戳或参数化形式创建日期。
  • getDay() 返回的是星期,0代表周日,和其他 get 方法的计数逻辑不同。
  • 修改 Date 对象的方法会直接改变原对象,如果需要保留原日期,建议先复制日期对象再操作。

示例展示了复制日期对象后再修改副本的方式。原始对象保持不变,副本对象发生日期变化,适合用于生成对比时间或保留基准时间。

const originalDate = new Date();
const copiedDate = new Date(originalDate.getTime());

copiedDate.setDate(copiedDate.getDate() + 1);

console.log('原日期:', originalDate);
console.log('复制后修改的日期:', copiedDate);

六、要点回顾与延伸建议

回顾整个 Date 对象的使用过程,可以把它概括为四个层次:创建读取修改组合操作。创建阶段决定如何得到一个时刻,读取阶段决定如何把时刻拆解为业务字段,修改阶段决定如何基于已有时刻生成新时刻,而格式化、计算和比较则是这些基础能力的组合。掌握这些层次后,开发者可以根据业务需求选择更清晰的实现方式。

在实际项目中,建议把常用日期逻辑封装成工具函数,例如统一格式化、统一偏移、统一比较和统一复制。对于来自外部系统的日期字符串,应先做格式校验和兼容性测试,再进入业务逻辑。对于需要展示给用户的时间,应明确使用统一的格式化规则,避免因为展示方式不同造成理解偏差。通过规范化的日期处理,可以减少边界错误,提高代码的可读性和可维护性。

JavaScriptDate对象日期操作日期方法修改时间:2026-07-13 14:18:16

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。