You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中如何判断America/New_York等其他时区是否已进入新一天

错误原因分析
  • 类型不匹配:调用format()方法后,$productMarketTime已经是字符串类型,而$start和$end是DateTime对象,二者直接比较的逻辑不符合预期,PHP会默认将对象转为字符串后再做对比,结果不可控。
  • 字符串排序逻辑不符合时间逻辑:就算将三个值都转为同格式的字符串比较,也会出问题。比如12:10 am的字符串排序大于01:00 am(因为首字符1比0的ASCII码大),但实际上凌晨12点10分早于凌晨1点,直接比较字符串会完全搞反时间先后。
  • 时区不统一:创建$start和$end时没有指定纽约时区,虽然仅对比时分的场景下影响不大,但统一时区可以避免夏令时切换等边界场景的异常。
修正方案

直接用DateTime对象做比较,不要转成字符串,同时保证三个时间使用相同的时区:

// 统一使用纽约时区
$nyTimeZone = new DateTimeZone('America/New_York');
$now = new DateTime("now", $nyTimeZone);
// 起始和结束时间统一用纽约时区,默认和当前时间同日期,保证对比的是同一天的时段
$start = DateTime::createFromFormat('h:i a', '12:05 am', $nyTimeZone);
$end = DateTime::createFromFormat('h:i a', '06:30 am', $nyTimeZone);

$condition = $now > $start && $now < $end;

dd([
   'now' => $now->format('h:i a'),
   'start' => $start->format('h:i a'),
   'end' => $end->format('h:i a'),
   'condition' => $condition
]);

内容的提问来源于stack exchange,提问作者Abdullah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 22:00:04