1

我们使用 MySQL DB 运行 Laravel 应用程序。数据库由许多与不同项目相关的条目组成。这个想法是,每个项目都有自己的时区,并输出相关条目,并相应地格式化其日期。因此,为了能够更改时区并出于兼容性考虑,所有条目都存储在 UTC 时区(应用程序默认时区也设置为 UTC)。问题是,例如,我们需要获取今天的条目,但在项目的 timezone中,而不是 UTC。我们使用碳,但它只格式化输出的日期,并且仍然在 UTC 时区比较它们。例如,在 UTC 时间的 12 月 7 日 22.32 上有一个条目。但是根据Europe/Moscow的说法,它是12月8日01.32制作的,应该算是今天进入Europe/Moscow时区的项目。尽管如此,即使给出了莫斯科时区,Carbon 仍将其视为昨天的条目(根据 UTC)。我们在查询中使用 whereDate:

whereDate( 'created_at', Carbon::now($project->timezone)->startOfDay() )

问题是 Carbon 在 Carbon::now('UTC') 和 Carbon::now('Europe/Moscow') 之间没有区别。如果你比较它们,它会给出零:

$tz1 = Carbon::now('UTC');
$tz2 = Carbon::now('Europe/Moscow');
echo tz1->diffInHours(tz2) //0

我想念什么?我应该如何正确地做到这一点?

4

1 回答 1

2

$tz1$tz2与他们有时区信息,并且都包含 now()时间信息。这就是为什么没有区别。使用shiftTimezone(). 所以

$tz1 = Carbon::now('UTC');
$tz2 = Carbon::now('Europe/Moscow')->shiftTimezone('UTC');
echo tz1->diffInHours(tz2) //should be appropriate 
于 2021-12-08T06:57:17.683 回答