最直接获取当前年份用 date('Y'),返回4位字符串;需配合 date_default_timezone_set() 设置正确时区,避免跨年错误;DateTime 类更面向对象且可控性强;禁用 strftime() 和 getdate()['year']。

用 date() 函数最直接
PHP 里获取当前年份,date('Y') 是最常用也最稳妥的方式。它返回 4 位数字年份(如 2024),基于服务器当前时区的时间。
注意:如果服务器时区没设对,结果可能不是你预期的年份。比如服务器在 UTC+0,而你在东八区,又没调 date_default_timezone_set(),就容易出错。
- 推荐写法:
date('Y') - 别用
date('y')—— 它只返回两位年份(24),容易歧义且不满足常规业务需求 - 如果需要整数类型而非字符串,可以显式转换:
(int) date('Y')
用 DateTime 类更面向对象
如果你的项目已大量使用面向对象风格,或者需要后续扩展(比如加月份、做日期计算),DateTime 更灵活。
它默认也用系统时区,但可以主动指定,可控性更强。
立即学习“PHP免费学习笔记(深入)”;
- 基础写法:
(new DateTime())->format('Y') - 指定时区写法:
(new DateTime('now', new DateTimeZone('Asia/Shanghai')))->format('Y') - 和
date()性能差异极小,日常使用不用纠结;但频繁调用时,date()略快一点
别用 getdate() 或 time() + strftime()
getdate() 返回的是数组,取年份得写 getdate()['year'],多一层访问且函数已标记为“不推荐用于新代码”;strftime() 在 Windows 下对中文环境支持不稳定,还依赖 locale 设置,容易返回空或乱码。
常见错误现象:strftime('%Y') 在某些 Linux 服务器返回空字符串,或在 Docker 容器里因缺失 locale 包直接失效。
- 绝对避免:
strftime('%Y', time()) - 也不推荐:
getdate()['year'](可读性差,且getdate()比date()慢约 20%)
时区设置是隐藏关键点
很多线上 bug 表现为“年份错了一年”,根源不在函数本身,而在时区。PHP 默认不继承系统时区,而是用 UTC 或未定义值。
务必在入口文件(如 index.php)开头或配置文件中明确设置:
date_default_timezone_set('Asia/Shanghai');
否则即使 date('Y') 写得再对,也可能返回 2023 而不是 2024 —— 尤其跨年时段最容易暴露。
检查当前生效时区可以用:date_default_timezone_get(),别凭感觉假设。



















