许多记录上碳的正确时区

Correct time-zone for carbon on many records

所以我正在尝试在 Carbon::today() 上设置正确的时区以获得为这一天创建的所有结果。 让我们再解释一下。

我有一个命令在今天 created_at 列时存档 Notes,所以我得到了今天创建的所有笔记,并根据 [=17] 在 foreach 中检查它们=]模型时区

数据库结构:

Buildings:
    -id
    -name
    -timezone

Notes:
    -id
    -name
    -created_at
    -updated_at
    -building_id (reference id on buildings)

我的代码:

$notes = Note::where('archived', null)
        ->whereDate('created_at',Carbon::today())
        ->get();


foreach($notes as $note) {
    // Set the current timezone 
    date_default_timezone_set($note->building->timezone)

    $note->update([
        'archived' =>1,
        'archived_at'=>Carbon::now()
    ]) // update archive status etc...
}

我希望 Carbon::today() 与记录建筑的当前时区一致。

我试过类似的查询,但问题仍未解决:

select
    *
from
    `notes`
    inner join `buildings` on `notes`.`building_id` = `buildings`.`id`
where
    date(`notes`.`created_at`) = CONVERT_TZ('NOW()', 'UTC', `building`.`timezone`);

有什么办法吗?谢谢。 :)

date_default_timezone_set顾名思义就是默认时区,您不应该在同一过程中多次更改默认时区。

实际上它应该始终保持 UTC,这样您就可以轻松地在外部扩展和共享它,然后您可以简单地获取给定时区的现在或今天:

Carbon::today($note->building->timezone)
Carbon::now($note->building->timezone)

但更好的解决方案是将您的日期也存储为数据库中的 UTC,这样您就可以将 created_at 从时区转换为 UTC,而不是将 NOW 从 UTC 转换为 building.timezone,这样会在您的数据库中实现数据一致性的更好方法。