最稳妥方式是用 date('Y-m-d') 与 date('Y-m-d', $timestamp) 字符串比较;关键在于统一时区,避免 UTC 与本地时区混用导致误判。

用 date() 和 strtotime() 判断是否今天最直接
PHP 没有内置的 “isToday()” 函数,但用 date('Y-m-d') 对比当前日期字符串是最稳妥、可读性最强的方式。它不依赖时区隐式转换,也不受时间戳精度干扰。
-
date('Y-m-d')返回格式化后的今天日期(如"2024-06-15"),类型是字符串,可直接比较 - 要判断某个时间是否为今天,先用
date('Y-m-d', $timestamp)格式化该时间,再和date('Y-m-d')对比 - 别用
time() - $timestamp 这类“差值小于24小时”的逻辑——跨午夜或夏令时切换时会出错
对比两个时间戳是否同一天,优先用 date('Ymd')
如果频繁判断且性能敏感(比如循环中处理上千条记录),date('Ymd') 比 'Y-m-d' 稍快:少两次字符比较(连字符),且结果仍是纯数字字符串,可安全用于 ==。
-
date('Ymd') === date('Ymd', $ts)是推荐写法,避免==隐式转整型导致的意外(如"2024-01-01"转成2024) - 不要用
floor($timestamp / 86400) === floor(time() / 86400)—— 在某些系统上time()可能返回 float,除法后取整不可靠 - 注意:所有方案都默认使用 PHP 当前时区(
date_default_timezone_get()),若业务涉及多时区,必须先用date_default_timezone_set()或DateTime显式指定
DateTime 类写法更严谨但稍重
当需要严格时区控制、或已用 DateTime 处理其他时间逻辑时,用对象方式更一致。
- 正确写法:
$today = new DateTime('today'); $target = new DateTime('@' . $timestamp); $target->setTimezone($today->getTimezone()); return $today->format('Y-m-d') === $target->format('Y-m-d'); - 常见错误:直接
new DateTime('@' . $timestamp)不设时区,会导致它按 UTC 解析,而new DateTime('today')按本地时区,两者根本不在同一参考系 - 如果只是单次判断,
DateTime的对象创建开销比date()高约 3–5 倍,没必要为简单需求引入
容易被忽略的时区陷阱
几乎所有“明明是今天却判断失败”的问题,根源都在时区没对齐。
立即学习“PHP免费学习笔记(深入)”;
- 检查
date_default_timezone_get()返回值,不是"Asia/Shanghai"就很可能出问题 - 数据库里存的
UNIX_TIMESTAMP是无时区的,但 PHP 用date()解析时会套用当前时区——若数据库按 UTC 存,而 PHP 设的是上海时区,就会差 8 小时 - 用
ini_set('date.timezone', 'Asia/Shanghai')比在脚本开头调date_default_timezone_set()更早生效,适合框架外裸跑场景
真正麻烦的从来不是“怎么写”,而是“在哪一刻、以什么时区解释那个时间”。把时区显式钉死,比选函数更重要。



















