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 对象的强大能力远超初印象。

在实际开发中,建议结合以下原则:

  1. 优先使用 UTC 方法(如 getUTC*)避免时区混乱;
  2. 善用时间戳进行跨时区计算;
  3. 避免直接解析模糊日期字符串(如用 new Date("2023/13/01") 可能导致意外结果)。

掌握这些技巧后,你将能更自信地处理 Web 开发中的日期相关挑战。如果遇到复杂场景,不妨结合 moment.js 或现代的 Date-fns 库进一步简化操作。

最新发布