Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да актуализирам часовата зона за времевите марки (created_at и updated_at), управлявани от Laravel Eloquent?

Знам, че този въпрос е малко остарял, но попаднах на него, когато се опитвах да намеря същото решение и исках да споделя как го реших.

Моят съвет би бил да не променяте часовата зона, в която се съхраняват съобщенията. Съхранявайте ги в базата данни като UTC. Поддържането на вашето хранилище на постоянна референтна рамка и след това преобразуването му във всяка часова зона, в която се нуждаете, ще ви спести много главоболие в дългосрочен план.

Като пример за едно от тези главоболия, представете си двама души, които се опитват да координират времето на среща в различни часови зони, където един спазва DST, а другият не и трябва да покажете часа в местното време на всеки потребител. Колко трудно би било да преобразувате съхраненото ви PDT време в Америка/Кайман (което не спазва DST)? И как бихте взели предвид, когато часовете се съхраняват в 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 мутатори/достъпници, разгледайте документацията .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Крайна стъпка на заявката е много дълга в произволни моменти

  2. Проблеми при инсталиране на MYSQL

  3. Как да се свържа с MySQL на Amazon EC2 от Windows?

  4. Как да използвам повторно стойности на auto_increment?

  5. mysqli::mysqli():(HY000/2002):Не мога да се свържа с локален MySQL сървър чрез сокет 'MySQL' (2)