JavaScript Date(日期)对象(千字长文)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
在 Web 开发中,日期和时间的处理几乎是每个项目都绕不开的需求。无论是用户注册时的生日验证、电商活动的倒计时功能,还是数据分析中的时间序列处理,JavaScript Date(日期)对象都是实现这些功能的核心工具。对于编程初学者而言,Date 对象看似简单,实则隐藏着许多细节和“陷阱”;而中级开发者则可能需要更深入的进阶技巧来应对复杂场景。本文将通过循序渐进的方式,结合实际案例,带你全面掌握 Date 对象的使用方法和最佳实践。
一、Date 对象的诞生:基础概念与创建
1.1 什么是 Date 对象?
Date 对象是 JavaScript 中用于处理日期和时间的核心对象,可以理解为一个“时间机器”——它不仅能记录当前的日期与时间,还能通过代码“穿梭”到过去或未来。例如,你可以用它来获取用户的注册日期,或者计算某个活动距离现在还有多少天。
1.2 创建 Date 对象的 3 种方式
Date 对象的创建方式灵活多样,以下是 3 种常用方法:
方式 1:获取当前时间
const now = new Date();
console.log(now); // 输出类似 "Mon Oct 30 2023 14:30:00 GMT+0800 (China Standard Time)"
方式 2:通过时间戳(毫秒)创建
const timestamp = 1700000000000; // 假设这是一个 Unix 时间戳(单位:毫秒)
const specificDate = new Date(timestamp);
console.log(specificDate); // 输出对应的时间点
方式 3:通过字符串参数指定日期
const birthday = new Date("2000-01-01"); // ISO 格式
const eventDate = new Date("October 31, 2023"); // 自然语言格式
注意:字符串格式需符合规范(如 ISO 标准或常见日期写法),否则可能导致解析错误。
二、获取日期与时间信息:基础操作
2.1 获取年、月、日等基础信息
Date 对象提供了多个实例方法来提取日期的各个组成部分:
方法名 | 描述 | 返回值范围 |
---|---|---|
getFullYear() | 获取四位年份(如 2023) | 1900 - 9999 |
getMonth() | 获取月份(0 表示一月) | 0 - 11 |
getDate() | 获取日期(1-31) | 1 - 31 |
getDay() | 获取星期几(0 表示周日) | 0 - 6 |
案例:计算某人的年龄
function calculateAge(birthDateString) {
const birthDate = new Date(birthDateString);
const now = new Date();
let age = now.getFullYear() - birthDate.getFullYear();
const monthDiff = now.getMonth() - birthDate.getMonth();
if (monthDiff < 0 || (monthDiff === 0 && now.getDate() < birthDate.getDate())) {
age--;
}
return age;
}
console.log(calculateAge("2000-01-01")); // 输出:23(假设当前年份为 2023)
2.2 获取时间部分:小时、分钟与毫秒
const now = new Date();
console.log(now.getHours()); // 0-23
console.log(now.getMinutes()); // 0-59
console.log(now.getSeconds()); // 0-59
console.log(now.getMilliseconds()); // 0-999
三、修改日期与时间:set 系列方法
Date 对象不仅支持读取,还能通过 set*
方法修改时间:
const event = new Date("2023-10-30");
event.setFullYear(2024); // 修改年份为 2024
event.setDate(31); // 将日期改为 31 日(注意:月份是否允许该日期)
console.log(event); // 输出 "Mon Nov 01 2024 00:00:00 GMT+0800(自动进位到下个月)"
警告:修改日期时需注意月份和日期的合法性。例如,setDate(31)
在 10 月(31 天)是合法的,但在 11 月(30 天)会导致日期自动进位到下个月。
四、时区与国际化:跨越地域的时间处理
4.1 时区偏移与 UTC 时间
JavaScript 默认使用本地时区显示时间,但可以通过以下方法获取 UTC(世界标准时间):
const now = new Date();
console.log(now.getTimezoneOffset()); // 返回本地时区与 UTC 的偏移分钟数(如东八区返回 -480)
console.log(now.getUTCHours()); // 获取 UTC 时区的小时
比喻:时区就像不同国家的时钟,getTimezoneOffset()
告诉你“你的时钟比标准时间快/慢多少分钟”。
4.2 国际化日期格式化
JavaScript 原生的 toString()
方法可能因浏览器和时区显示混乱,推荐使用 Intl.DateTimeFormat
:
const date = new Date();
// 在中国显示:2023-10-30
console.log(new Intl.DateTimeFormat("zh-CN", { year: "numeric", month: "2-digit", day: "2-digit" }).format(date));
// 在美国显示:10/30/2023
console.log(new Intl.DateTimeFormat("en-US", { dateStyle: "short" }).format(date));
五、进阶技巧与实战案例
5.1 时间戳的妙用
时间戳(从 1970-01-01 00:00:00 UTC 到现在的毫秒数)是跨平台时间计算的“通用货币”:
// 计算两个日期之间的天数差
function daysBetween(date1, date2) {
const diffMs = Math.abs(date2 - date1); // 直接相减得到毫秒差
return Math.floor(diffMs / (1000 * 60 * 60 * 24));
}
const d1 = new Date("2023-01-01");
const d2 = new Date("2023-01-10");
console.log(daysBetween(d1, d2)); // 输出 9
5.2 处理时区转换的陷阱
假设你需要将北京的时间(UTC+8)转换为纽约时间(UTC-4):
function convertToTimeZone(date, targetOffset) {
const utc = date.getTime() + (date.getTimezoneOffset() * 60 * 1000);
return new Date(utc + (3600 * 1000 * targetOffset));
}
const beijingTime = new Date("2023-10-30T12:00:00"); // 北京中午 12 点
const newYorkTime = convertToTimeZone(beijingTime, -4);
console.log(newYorkTime); // 输出纽约时间(UTC-4)的对应时刻
六、常见问题与解决方案
6.1 月份从 0 开始的困惑
问题:为什么 getMonth()
返回 0 表示一月?
解答:这是为了与 Unix 时间的索引规则保持一致,避免“+1”的计算错误。
6.2 处理闰年与月份天数
function getDaysInMonth(year, month) {
return new Date(year, month + 1, 0).getDate(); // 例如:getDaysInMonth(2023, 1) → 28(闰年 2 月)
}
结论
通过本文,我们系统学习了 JavaScript Date(日期)对象 的核心功能、常见操作以及进阶技巧。从基础的日期创建、时间获取,到复杂的时区转换和国际化处理,Date 对象的强大能力远超初印象。
在实际开发中,建议结合以下原则:
- 优先使用 UTC 方法(如
getUTC*
)避免时区混乱; - 善用时间戳进行跨时区计算;
- 避免直接解析模糊日期字符串(如用
new Date("2023/13/01")
可能导致意外结果)。
掌握这些技巧后,你将能更自信地处理 Web 开发中的日期相关挑战。如果遇到复杂场景,不妨结合 moment.js
或现代的 Date-fns
库进一步简化操作。