12

我在 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 时区工作,以便将期货插入数据库。

任何帮助都会很有用。谢谢。

4

4 回答 4

26

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

我的建议是不要更改存储消息的时区。将它们作为 UTC 存储在数据库中。将您的存储设置为恒定的参考框架,然后将其转换为您需要显示的任何时区,从长远来看,这将为您省去很多麻烦。

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

要在正确的时区中超时,只需在模型本身上添加一个 mutator 函数:

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 修改器/访问器的更多信息,请查看文档

于 2014-06-24T21:30:23.570 回答
3

我不确定我是否理解您是否要更改服务器的设置以便将来输入数据库,或者您是否要更新数据库中的当前值。

如果是后者,更改服务器设置不会影响数据库中的当前记录。如果要更改现有字段的值,可以使用 MySQL 命令执行此操作,例如:

 update `table` set created_at = (SELECT created_at) + INTERVAL 2 HOUR;

wheretable是数据库表的名称,并且2是以小时为单位的偏移量。

于 2013-09-30T00:14:48.443 回答
2

很简单,修改AppServiceProvider.php中的boot()函数即可

public function boot()
{
    //set local timezone
    date_default_timezone_set('Asia/Shanghai');
}
于 2016-06-29T02:29:24.527 回答
0

对于 Lumen,它可以在 .env 文件中使用:

DB_TIMEZONE="+03:00"

于 2019-09-01T20:00:16.470 回答