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

时间:2013-09-29 23:49:01

标签: php mysql timezone laravel eloquent

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

我已经做了一些尝试来完成这项测试,但没有一个是正确的。

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

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

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

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

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

4 个答案:

答案 0 :(得分:14)

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

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

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

要在正确的时区内抽出时间,只需在模型上添加一个mutator函数:

use Carbon\Carbon;

class MyModel extends Eloquent
{
    //  {{{ getCreatedAtAttribute()

    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 mutators / accessors的更多信息,请查看documentation

答案 1 :(得分:4)

这很简单,只需修改AppServiceProvider.php中的函数boot()

即可
def Button(msg, x, y, w, h, ic, ac, action=None):
    mouse = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()
    if x+w > mouse[0] > x and y+h > mouse[1] > y:
        pygame.draw.rect(window, ac, (x, y, w, h))
        #if event.type == pygame.MOUSEBUTTONDOWN:
        if click[0] == 1 and action != None:
            pygame.draw.rect(window, lightgrey, (x, y, w, h))
            if action == "undo":
                print("hey")  
            if action == "reset":
                for row in range(6):
                    for column in range(7):
                        board[row][column] = 0          
            elif action == "quit":
                pygame.quit()
                quit()


    else:
        pygame.draw.rect(window, ic, (x, y, w, h))

答案 2 :(得分:1)

如果您想更改服务器的设置以便将来输入数据库,或者您想要更新数据库中的当前值,我并不完全确定。

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

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

其中table是数据库表的名称,2是以小时为单位的偏移量。

答案 3 :(得分:0)

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

  

DB_TIMEZONE =“ + 03:00”