如何使用PHP Carbon在指定时区判断当前时间是否在时段内?
问题分析与解决方案
你的代码存在两个核心问题:
- 日期对齐错误:
Carbon::createFromFormat('H:i', ...)会默认使用服务器当前时区的日期生成完整时间,转成布里斯班时区后,日期会和实际布里斯班当前日期偏差(比如你例子中服务器UTC日期是27日,转成布里斯班时区还是27日,但实际布里斯班已经是28日)。 - 跨天场景未处理:如果当前时间是次日凌晨,而营业时间结束时间是前一天的23:30,直接用
between判断会失效。
修正方案一(基于Carbon对象,支持跨天)
// 直接获取布里斯班当前时间,避免时区转换混淆 $currentBrisbaneTime = Carbon::now('Australia/Brisbane'); // 将营业时间的时分,设置到当前布里斯班的日期上 $storeStartTime = $currentBrisbaneTime->copy()->setTimeFromTimeString($seller->start_time); $storeEndTime = $currentBrisbaneTime->copy()->setTimeFromTimeString($seller->end_time); // 处理跨天情况:如果结束时间早于开始时间,说明营业时间跨到次日 if ($storeEndTime->lessThan($storeStartTime)) { $storeEndTime->addDay(); } // 现在可以正确判断当前时间是否在区间内 if ($currentBrisbaneTime->between($storeStartTime, $storeEndTime)) { // 处于营业时间内 }
修正方案二(轻量时分比较,适合固定每日时段)
如果不需要完整的Carbon对象,仅需判断时分是否在区间内,可以直接比较字符串:
$currentBrisbaneTime = Carbon::now('Australia/Brisbane'); $currentHourMinute = $currentBrisbaneTime->format('H:i'); $startTime = $seller->start_time; $endTime = $seller->end_time; // 处理跨天逻辑 if ($endTime < $startTime) { $isInRange = $currentHourMinute >= $startTime || $currentHourMinute <= $endTime; } else { $isInRange = $currentHourMinute >= $startTime && $currentHourMinute <= $endTime; } if ($isInRange) { // 处于营业时间内 }
内容的提问来源于stack exchange,提问作者Aishwarya
相关产品推荐
相关产品推荐

