gpt4 book ai didi

php - 如何更新由 Laravel Eloquent 管理的时间戳(created_at 和 updated_at)的时区?

转载 作者:可可西里 更新时间:2023-11-01 06:31:37 24 4
gpt4 key购买 nike

我有一个 GMT 时间的服务器,但我想更新这些字段( *created_at* 和 *updated_at* )以保存 PST 时间戳。

我已经做了一些测试来尝试实现这一点,但没有一个是正确的。

  • 我将 config/application.php 更新为 'timezone' => 'America/Los_Angeles'
  • 同样在服务器中,我将 php.ini 中的 date.timezone 更改为 'America/Los_Angeles'

但是任何这些更新都会将时区更新应用于 Laravel Eloquent 时间戳。这个字段 created_at 和 updated_at 由 Eloquent 处理。

我还使用 sudo dpkg-reconfigure tzdata 更新了 Ubuntu 服务器时区,但此更新根本不起作用。

编辑:我需要让 Laravel Eloquent 时间戳在 PST 时区工作,以便将来插入数据库。

任何帮助都是有用的。谢谢。

最佳答案

我知道这个问题有点过时了,但我在尝试提出相同的解决方案时偶然发现了它,并想分享我是如何解决它的。

我的建议是不要更改存储消息的时区。将它们作为 UTC 存储在数据库中。将您的存储设置为一个恒定的引用系,然后将其转换为您需要显示的任何时区,从长远来看将为您省去大量的麻烦。

举一个令人头疼的问题的例子,假设两个人试图协调不同时区的 session 时间,其中一个遵守夏令时而另一个不遵守夏令时,而您需要以每个用户的本地时间显示时间。将您存储的 PDT 时间转换为 America/Cayman(不遵守夏令时)有多难?当时间存储在 PST 和 PDT 中时,您将如何考虑?你怎么知道的? (提示:如果没有数百行额外代码来回答那个问题,您不会)。

要获得正确时区的超时时间,只需在模型本身上添加一个修改函数:

use Carbon\Carbon;

class MyModel extends Eloquent
{
public function getCreatedAtAttribute($value)
{
return Carbon::createFromTimestamp(strtotime($value))
->timezone('America/Los_Angeles')
->toDateTimeString()
;
}
}

现在,无论何时执行 $myModel->created_at,它都会神奇地转换为正确的时区,但您仍将 UTC 保留在数据库中,这在持久存储方面肯定比其他时区有优势。

想让用户设置自己的时区?将函数更改为:

public function getCreatedAtAttribute($value)
{
$user = Auth::user();
// If no user is logged in, we'll just default to the
// application's timezone
$timezone = $user ? $user->timezone : Config::get('app.timezone');

return Carbon::createFromTimestamp(strtotime($value))
->timezone($timezone)
// Leave this part off if you want to keep the property as
// a Carbon object rather than always just returning a string
->toDateTimeString()
;
}

更改时区、考虑或不考虑夏令时的所有复杂性都从您身上抽象出来,您甚至可以忘记它甚至必须发生。

有关 Laravel 修改器/访问器的更多信息,请查看 documentation .

关于php - 如何更新由 Laravel Eloquent 管理的时间戳(created_at 和 updated_at)的时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19084619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com