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

如何使用PHP Carbon在指定时区判断当前时间是否在时段内?

问题分析与解决方案

你的代码存在两个核心问题:

  1. 日期对齐错误:Carbon::createFromFormat('H:i', ...)会默认使用服务器当前时区的日期生成完整时间,转成布里斯班时区后,日期会和实际布里斯班当前日期偏差(比如你例子中服务器UTC日期是27日,转成布里斯班时区还是27日,但实际布里斯班已经是28日)。
  2. 跨天场景未处理:如果当前时间是次日凌晨,而营业时间结束时间是前一天的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:42:28