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
相关产品推荐
相关产品推荐

