date('w')返回0-6(周日到周六),(date('w')+6)%7+1转为1-7(周一到周日);中文星期需数组映射,如['星期日','星期一',...];DateTime对象支持时区,format('w')行为同date('w')。

用 date() 获取星期几数字(0-6)
PHP 默认的 date() 函数返回的是以周日为 0 的数字:周日=0,周一=1,……,周六=6。这是最轻量、最常用的方式,适合做逻辑判断或数组索引。
- 直接写
date('w') 就能拿到当前是星期几的数字
- 如果想从周一算作第 1 天(更符合国内习惯),可以用
(date('w') + 6) % 7 + 1,结果是 1~7
- 注意:
'w' 不受 setlocale() 影响,跟系统语言无关,纯 PHP 内置规则
用 date() 获取中文星期几文字
要输出“星期一”“周二”这类可读文本,不能依赖 date('l')(它返回英文),得自己映射。PHP 没有内置中文星期格式符,硬套 strftime() 在某些环境(如 Windows + 非 UTF-8 locale)还容易乱码。
- 推荐用简单数组映射:
$weekdays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']; echo $weekdays[date('w')];
- 避免用
strftime('%A'),除非你确认 setlocale(LC_TIME, 'zh_CN.UTF-8') 生效且 Web 服务器字符集一致
- 如果项目已用 Laravel 或 Symfony,可考虑其本地化组件,但纯 PHP 场景没必要引入复杂依赖
DateTime 对象方式获取星期几(适合需要时区或日期计算的场景)
当你要处理非当前时间、跨时区,或者后续还要做加减运算时,DateTime 比 date() 更可控。它的 format('w') 行为和函数版完全一致,但对象封装让逻辑更清晰。
- 基础写法:
(new DateTime())->format('w'),等价于 date('w')
- 指定时区:
(new DateTime('now', new DateTimeZone('Asia/Shanghai')))->format('w')
- 别写
$dt->format('N') 以为能直接得“周一=1”,'N' 是 ISO-8601 标准(周一=1,周日=7),但很多老系统或配置下不兼容,不如自己算稳妥
常见错误:date('D') 和 date('l') 返回英文,不是中文
看到 date('D') 输出 Mon、date('l') 输出 Monday 就以为“能用”,结果上线后全是英文,客户问“怎么没中文”。这不是 bug,是设计如此——PHP 的这些格式符只认 locale 设置,不自动翻译。
-
'D' 是缩写英文(Mon~Sun),'l'(小写 L)是全称英文(Monday~Sunday)
- 即使设置了
setlocale(LC_TIME, 'zh_CN'),Linux 下可能生效,Windows 下大概率失效,且依赖系统安装对应 locale 包
- 线上环境通常精简,不建议赌 locale 可靠性;中文显示一律走数组映射最稳
真正麻烦的不是“怎么取数字”,而是后续要不要转成文字、要不要适配时区、要不要兼容旧 PHP 版本(比如 5.6 不支持某些 DateTime 语法),这些细节比一行代码更容易出问题。
date('w') 就能拿到当前是星期几的数字(date('w') + 6) % 7 + 1,结果是 1~7'w' 不受 setlocale() 影响,跟系统语言无关,纯 PHP 内置规则date() 获取中文星期几文字
要输出“星期一”“周二”这类可读文本,不能依赖 date('l')(它返回英文),得自己映射。PHP 没有内置中文星期格式符,硬套 strftime() 在某些环境(如 Windows + 非 UTF-8 locale)还容易乱码。
- 推荐用简单数组映射:
$weekdays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']; echo $weekdays[date('w')]; - 避免用
strftime('%A'),除非你确认setlocale(LC_TIME, 'zh_CN.UTF-8')生效且 Web 服务器字符集一致 - 如果项目已用 Laravel 或 Symfony,可考虑其本地化组件,但纯 PHP 场景没必要引入复杂依赖
DateTime 对象方式获取星期几(适合需要时区或日期计算的场景)
当你要处理非当前时间、跨时区,或者后续还要做加减运算时,DateTime 比 date() 更可控。它的 format('w') 行为和函数版完全一致,但对象封装让逻辑更清晰。
- 基础写法:
(new DateTime())->format('w'),等价于 date('w')
- 指定时区:
(new DateTime('now', new DateTimeZone('Asia/Shanghai')))->format('w')
- 别写
$dt->format('N') 以为能直接得“周一=1”,'N' 是 ISO-8601 标准(周一=1,周日=7),但很多老系统或配置下不兼容,不如自己算稳妥
常见错误:date('D') 和 date('l') 返回英文,不是中文
看到 date('D') 输出 Mon、date('l') 输出 Monday 就以为“能用”,结果上线后全是英文,客户问“怎么没中文”。这不是 bug,是设计如此——PHP 的这些格式符只认 locale 设置,不自动翻译。
-
'D' 是缩写英文(Mon~Sun),'l'(小写 L)是全称英文(Monday~Sunday)
- 即使设置了
setlocale(LC_TIME, 'zh_CN'),Linux 下可能生效,Windows 下大概率失效,且依赖系统安装对应 locale 包
- 线上环境通常精简,不建议赌 locale 可靠性;中文显示一律走数组映射最稳
真正麻烦的不是“怎么取数字”,而是后续要不要转成文字、要不要适配时区、要不要兼容旧 PHP 版本(比如 5.6 不支持某些 DateTime 语法),这些细节比一行代码更容易出问题。
(new DateTime())->format('w'),等价于 date('w')
(new DateTime('now', new DateTimeZone('Asia/Shanghai')))->format('w')
$dt->format('N') 以为能直接得“周一=1”,'N' 是 ISO-8601 标准(周一=1,周日=7),但很多老系统或配置下不兼容,不如自己算稳妥date('D') 和 date('l') 返回英文,不是中文
看到 date('D') 输出 Mon、date('l') 输出 Monday 就以为“能用”,结果上线后全是英文,客户问“怎么没中文”。这不是 bug,是设计如此——PHP 的这些格式符只认 locale 设置,不自动翻译。
-
'D'是缩写英文(Mon~Sun),'l'(小写 L)是全称英文(Monday~Sunday) - 即使设置了
setlocale(LC_TIME, 'zh_CN'),Linux 下可能生效,Windows 下大概率失效,且依赖系统安装对应 locale 包 - 线上环境通常精简,不建议赌 locale 可靠性;中文显示一律走数组映射最稳
DateTime 语法),这些细节比一行代码更容易出问题。



















