localtime() 返回9元素数组,tm_mon为0–11、tm_year为距1900年年数、tm_wday周日为0、tm_yday从0开始、tm_isdst正数表夏令时生效;需设时区且校验时间戳合法性。

PHP 的 localtime() 不是日常格式化时间的首选,它返回的是底层 C 风格的结构化时间数组,适合需要高性能拆解、或与系统级时间逻辑对接的场景。
localtime() 返回的数组结构怎么理解
它返回一个 9 元素数组(索引版)或关联键名数组(associative = true),但字段含义和日常直觉有明显偏差:
-
tm_mon是 0–11(不是 1–12),tm_year是距 1900 年的年数(比如 2026 年对应126) -
tm_wday周日为 0,tm_yday从 0 开始计(全年第 0–365 天) -
tm_isdst:正数表示夏令时生效,0 表示未生效,负数表示未知(常见于历史时间戳或时区配置缺失) - 索引数组顺序固定:
[tm_sec, tm_min, tm_hour, tm_mday, tm_mon, tm_year, tm_wday, tm_yday, tm_isdst]
localtime() 和 getdate() 的关键区别在哪
两者都返回时间“零件”,但设计目标不同:
-
getdate()更友好:mon是 1–12,year是完整四位年份(如2026),还有weekday、month这类字符串字段,适合快速展示 -
localtime()更轻量、更贴近 C 底层,不依赖区域设置(locale),执行更快,但字段需手动转换(比如$t['tm_mon'] + 1才是真实月份) - 如果只是想显示“今天几月几号”,用
getdate()或date()更安全;只有在压测、高频循环中解析大量时间戳时,才值得考虑localtime()
调用 localtime() 前必须处理的时区问题
它完全依赖系统时区或 PHP 默认时区,且不会抛出异常——错误时区下结果静默错位:
立即学习“PHP免费学习笔记(深入)”;
- 没设时区时,
localtime()可能回退到 UTC 或系统本地时区(行为不可控) - 必须提前调用
date_default_timezone_set('Asia/Shanghai'),否则tm_isdst可能恒为 0,历史时间(如 2007 年前)夏令时判断失效 - 注意:即使设置了时区,
localtime(time(), true)对 1970 年前或 2100 年后的时间戳支持有限,部分系统 libc 实现有截断
实际用法示例与避坑点
以下代码演示典型用法及易错细节:
<?php
// ✅ 正确:显式设时区 + 关联数组便于读取
date_default_timezone_set('Asia/Shanghai');
$now = localtime(time(), true);
echo $now['tm_mday'] . ' 日 '; // 直接取日(无需 +1)
echo ($now['tm_mon'] + 1) . ' 月 '; // 月份要 +1
echo ($now['tm_year'] + 1900) . ' 年 '; // 年份要 +1900
// ❌ 错误:不设时区,或直接用索引数组却忽略偏移
$raw = localtime(); // 索引数组
echo $raw[4]; // 这是 tm_mon,值为 7 表示 8 月,不是 7 月
?>
真正容易被忽略的是:它不校验输入时间戳是否合法。传入 -1 或极大负数时,可能返回全零数组或随机值,而不是报错——务必在调用前做 is_int($ts) && $ts >= 0 校验。



















