date() 是 php7 中最直接稳定的时间格式化方式,需传入 int 时间戳;非法输入会静默失败,推荐 datetime::createfromformat('u', ...) 进行严格校验,避免时区与类型问题导致线上异常。

date() 是 PHP7 中最直接、最稳定的方式,不需要额外依赖,也无需担心对象初始化开销。只要传入的是合法的 int 时间戳,就能立刻得到格式化字符串。
用 date() 格式化时间戳必须传 int 类型
常见错误是把字符串当时间戳传进去:date('Y-m-d', '1623456789') —— 这会触发警告并返回 false,因为第二个参数必须是整数。PHP7 对类型更严格,不会自动转换。
- 正确写法:
date('Y-m-d', 1623456789)或date('Y-m-d', (int)$timestamp) - 如果来源不可靠(比如来自 GET 参数),先强制转 int:
$ts = (int)$_GET['ts']; if ($ts > 0) echo date('Y-m-d H:i:s', $ts); - 注意:PHP7 默认不报
E_WARNING给date()的非法参数,但结果为 false,容易静默失败
DateTime::createFromFormat('U', ...) 更适合校验场景
当你需要确认输入是否真是有效时间戳(比如防 0、负数、超大值),DateTime 比 date() 更可控。它不会对非法值“将就”,而是返回 false,便于显式处理。
$dt = DateTime::createFromFormat('U', $raw_input); if (!$dt) { /* 处理错误 */ }- 后续调用
$dt->format('Y-m-d H:i:s')安全,且支持链式设置时区:$dt->setTimezone(new DateTimeZone('Asia/Shanghai')) - 注意:
'U'是唯一能直接解析 Unix 时间戳的格式符;用new DateTime('@'.$ts)也可,但 '@' 前缀在某些旧版本有兼容问题
别用 strftime() 或 gmstrftime() 在 PHP7 生产环境
这两个函数在 PHP7.4 已被标记为 deprecated,PHP8 直接移除。它们依赖 setlocale(),而 locale 设置容易受系统影响,跨服务器行为不一致,中文输出尤其不稳定。
- 例如:
strftime('%Y年%m月%d日', $ts)在 Docker 容器里可能输出乱码或空字符串 - 替代方案:用
date()拼接中文字符,如date('Y', $ts).'年'.date('m', $ts).'月'.date('d', $ts).'日' - 如果真要本地化,优先选
IntlDateFormatter(需启用 intl 扩展),但代价是复杂度和性能开销明显上升
时区问题不是“设一次就完事”
date() 和 DateTime 都默认使用 date_default_timezone_get() 返回的时区,但它可能不是你想要的。PHP7 不再容忍未设置时区的脚本(会发 E_WARNING)。
- 线上必须显式调用
date_default_timezone_set('Asia/Shanghai'),不能只靠 php.ini - 避免混用:
date()用本地时区,gmdate()强制 UTC——两者结果差 8 小时,一不留神就显示成“昨天” - 关键逻辑中建议统一用
DateTime实例并显式setTimezone(),比全局时区更可靠
实际项目里,简单展示用 date() 足够;涉及用户时区、多语言、或输入不可信时,DateTime::createFromFormat('U', ...) 才是真正兜得住的写法。别省那几行代码,类型校验和时区控制漏一处,线上就可能出凌晨三点发帖显示成“刚刚”的诡异问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











