JS 怎么获取当前日期是星期几

作者:纸飞机时间:2026-11-06 15:45:03浏览:237

详细讲解在 JavaScript 中获取当前日期是星期几的完整方法,涵盖 getDay() 核心原理、中文数组映射、Intl.DateTimeFormat 国际化方案、ISO 8601 转换及常见混淆避坑指南。

在 JavaScript 中获取当前日期是星期几,核心操作是调用日期实例的原生方法 new Date().getDay()。该方法返回一个 0 到 6 之间的离散整数,其中 0 代表星期日,1 到 6 依次对应星期一至星期六。为了将数字转换为人类可读的中文表达(如“星期三”或“周三”),最轻量可靠的做法是配合“中文字符数组”进行索引映射,而在跨国多语言场景下则可以直接使用 ECMAScript 国际化标准 Intl.DateTimeFormat。本文将按步骤拆解完整的实现流程、代码写法及关键避坑事项。

JS 怎么获取当前日期是星期几
图 0:JavaScript 获取星期几的底层处理管线架构概览

一、基础标准解法:getDay() 配合数组映射

JavaScript 原生 Date 对象直接提供了获取星期索引的 API。由于计算机标准中的时间索引为纯数字,我们只需准备一个与 0 到 6 下标精确对齐的中文字符串数组,即可通过常数时间复杂度 O(1) 完成转换。

1. 极简单行代码

如果只是在业务代码中快速读取并拼接,可以直接在一行代码内完成实例化、取索引与数组寻址:

// 执行环境:现代浏览器控制台或 Node.js 环境
const today = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'][new Date().getDay()];
console.log(today);
示例运行输出
"星期六"

2. 规范化函数封装

在实际项目开发中,页面不同位置可能需要显示“星期几”或“周几”(例如日历卡片显示“周六”,详细报表显示“星期六”)。建议封装成支持格式前缀的通用工具函数:

/**
 * 获取当前日期或指定日期的中文星期名称
 * @param {Date} [date=new Date()] 可选的目标日期对象,缺省为当前时间
 * @param {'full'|'short'} [format='full'] 'full' 输出 "星期X",'short' 输出 "周X"
 * @returns {string} 格式化后的中文星期文本
 */
function getWeekdayName(date = new Date(), format = 'full') {
  const dayIndex = date.getDay();
  const fullDays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
  const shortDays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
  
  return format === 'short' ? shortDays[dayIndex] : fullDays[dayIndex];
}

// 调用示例
console.log(getWeekdayName());               // 输出示例: "星期六"
console.log(getWeekdayName(new Date(), 'short')); // 输出示例: "周六"
JS 怎么获取当前日期是星期几
图 1:从创建时间对象到数组映射输出中文星期的完整三步流程

二、核心机制解析:0 为什么是周日与 API 混淆防范

许多初学者在编写获取星期的逻辑时,常常会遇到两类典型问题:一是映射出来的星期相差一天,二是误将月份里的“几号”当成了“星期几”。理解底层的设计规约是规避此类缺陷的前提。

1. 为什么 getDay() 中 0 代表星期日?

JavaScript 诞生于 1995 年,其 Date 对象的底层规范直接继承自 Java 1.0 的 java.util.Date,而 Java 又参考了更早的 C 语言 time.h 标准。在西方历法传统(如北美与基督教历法规范)中,星期日被视作一周的第一天,因此数字 0 被赋予了星期日(Sunday)。

很多开发者习惯周一为一周起始,容易误在数组第 0 位写上 '星期一',导致所有周日均被错误判定为周一。因此务必牢记:数组下标 0 必须严格对应“星期日”。

2. 务必区分 getDay() 与 getDate()

由于两个方法名称极其相似,仅差一个字母,编码补全或快速录入时经常发生混淆:

  • date.getDay():获取星期几,返回值仅有 0, 1, 2, 3, 4, 5, 6。
  • date.getDate():获取月份中的公历几号,返回值是 1 ~ 31。

如果把 getDay() 误写成 getDate(),若当天是 28 号,days[28] 会因下标越界直接返回 undefined,导致页面展示白屏或出现 "undefined" 字符。

JS 怎么获取当前日期是星期几
图 2:getDay() 与 getDate() 机制差异及 7 个槽位内存映射关系

三、现代原生免维护方案:Intl 国际化 API

如果项目需要根据用户的语言环境展示对应的星期名称(例如中文展示“星期三”,英文展示“Wednesday”,日文展示“水曜日”),使用手写数组往往需要维护大量多语言词条。ECMAScript 国际化标准(ECMA-402)为我们提供了原生支持。

1. 使用 toLocaleDateString 快速格式化

Date.prototype.toLocaleDateString() 允许通过配置项单独提取星期字符串:

const now = new Date();

// 完整中文名称 (weekday: 'long')
const zhLong = now.toLocaleDateString('zh-CN', { weekday: 'long' });
console.log(zhLong); // 输出示例: "星期六"

// 缩写中文名称 (weekday: 'short')
const zhShort = now.toLocaleDateString('zh-CN', { weekday: 'short' });
console.log(zhShort); // 输出示例: "周六"

// 英文环境无缝切换
const enLong = now.toLocaleDateString('en-US', { weekday: 'long' });
console.log(enLong); // 输出示例: "Saturday"

2. 高频调用下的性能优化:Intl.DateTimeFormat 实例复用

如果在表格列表渲染、数据流处理等高频循环场景中使用 toLocaleDateString,每次调用都会在底层构造新的格式化解析上下文。对于性能要求较高的场景,推荐在模块顶部创建单例 Intl.DateTimeFormat 实例并反复调用其实例方法 format():

// 模块级只初始化一次
const weekdayFormatterZh = new Intl.DateTimeFormat('zh-CN', { weekday: 'long' });

// 后续循环中复用,执行速度大幅提升
function formatWeekdayFast(date) {
  return weekdayFormatterZh.format(date);
}

console.log(formatWeekdayFast(new Date())); // 输出: "星期六"
JS 怎么获取当前日期是星期几
图 3:静态数组映射方案与 Intl 国际化体系的架构与执行开销对比

四、实际业务中的常见拓展与边界处理

在实际生产业务中,获取星期往往不仅仅用于直接打印文本,还常常参与业务日历排班、周统计报表计算以及历史时间回溯。以下列举四个核心场景的处理方法:

1. 转换为 ISO 8601 标准数字(星期一为 1,星期日为 7)

在很多后台数据统计中(例如周报汇总、考勤排班),业务规则通常以周一作为一周的第一天,周日作为最后一天(值取 1 至 7)。原生 getDay() 返回的 0 无法直接用于这类计算,需要进行简单转换:

function getIsoWeekdayNumber(date = new Date()) {
  const day = date.getDay();
  // 当 day 为 0(周日)时转换为 7,其余保持 1~6
  return day === 0 ? 7 : day;
}

console.log(getIsoWeekdayNumber(new Date())); // 周六输出: 6,周日输出: 7

2. 获取指定日期字符串是星期几

当需要查询某个特定历史或未来日期(如“2026-10-31”)是星期几时,可以直接将日期字符串传给 new Date()。但在跨平台兼容性方面,不同浏览器对日期解析格式宽容度不同,最安全的标准格式为 YYYY/MM/DD 或标准的 ISO 8601 格式 YYYY-MM-DDTHH:mm:ss:

// 推荐使用明确的年、月、日解析,避免部分移动端对 "2026-10-31" 产生时区偏差
const targetDate = new Date('2026/10/31');
const days = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
console.log(days[targetDate.getDay()]); // 验证输出: "星期六"

3. 处理 UTC 跨时区场景:getUTCDay()

new Date().getDay() 返回的是宿主系统当前本地时区下的星期几。在跨时区国际协作系统中(例如服务器部署在格林尼治 UTC 时区,或处理统一的 UTC 日志数据),若需要获取国际标准时间的星期,应显式调用 date.getUTCDay():

const now = new Date();
const localDay = now.getDay();     // 用户设备本地时区星期索引
const utcDay = now.getUTCDay();     // 零时区 UTC 星期索引
工程避坑提示:防范 Invalid Date 异常

如果动态传入的日期参数格式错误(例如 new Date('invalid-string')),此时调用 .getDay() 会返回 NaN,作为数组索引 days[NaN] 将返回 undefined。在健壮的生产级代码中,建议使用 isNaN(date.getTime()) 进行前置防御检查。

五、方案选型矩阵与生产环境检查单

综合比较两种核心方案在性能、灵活性及依赖环境上的差异,可以参考下表进行技术选型:

对比维度 静态数组映射方案 (Array Mapping) 国际化 API 方案 (Intl / toLocale)
核心代码 ['星期日', ...][date.getDay()] date.toLocaleDateString('zh-CN', {weekday: 'long'})
执行耗时 极速(纳秒级,几乎无额外开销) 常规微秒级(复用 Formatter 实例后性能良好)
多语言能力 需手工维护字典数组 原生支持全球数百种语言环境与变体
定制灵活性 极高(可自由定制“礼拜X”、“周X”或带图标文案) 按语言标准格式输出(long / short / narrow)
兼容性 所有 JavaScript 宿主(ES1+,全环境通用) 现代浏览器及带有完整 ICU 的 Node.js (ES6+)
推荐场景 常规中文业务界面、移动端 H5、高频循环数据流 多语言国际化系统、全球化出海产品
JS 怎么获取当前日期是星期几
图 4:技术选型决策树与工程落地质量检查单

生产上线检查清单(Checklist)

  1. 接口调用核验:确认调用的是 getDay(),绝不是 getDate()。
  2. 首位对应关系:预置数组的第 0 项必须对应“星期日”,不可将“星期一”置于数组首位。
  3. 类型安全防范:对非当前时间的外部入参做 isNaN(date.getTime()) 防御校验,避免输出 undefined。
  4. 时区基准确认:明确当前场景需要的是设备本地时间还是 UTC 标准时间,选择对应的 getDay() 或 getUTCDay()。
作者最新文章

相关标签:

相关文章
更多