Знам, че този въпрос е малко остарял, но попаднах на него, когато се опитвах да намеря същото решение и исках да споделя как го реших.
Моят съвет би бил да не променяте часовата зона, в която се съхраняват съобщенията. Съхранявайте ги в базата данни като 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 мутатори/достъпници, разгледайте документацията .