sql >> Database >  >> RDS >> Mysql

Hoe de tijdzone bijwerken voor de tijdstempels (created_at en updated_at) beheerd door Laravel Eloquent?

Ik weet dat deze vraag een beetje gedateerd is, maar ik kwam hem tegen toen ik probeerde met dezelfde oplossing te komen, en ik wilde vertellen hoe ik deze heb opgelost.

Mijn advies zou zijn om de tijdzone waarin de berichten worden opgeslagen niet te wijzigen. Bewaar ze in de database als UTC. Door uw opslag op een constant referentiekader te houden en deze vervolgens te converteren naar de tijdzone waarin u deze wilt weergeven, bespaart u op de lange termijn veel hoofdpijn.

Als voorbeeld van een van die hoofdpijnen, stel je voor dat twee mensen proberen een vergadertijd in verschillende tijdzones te coördineren waar de ene zomertijd in acht neemt en de andere niet en je de tijd in de lokale tijd van elke gebruiker moet weergeven. Hoe moeilijk zou het zijn om uw opgeslagen PDT-tijd om te zetten in bijvoorbeeld Amerika/Cayman (die geen zomertijd in acht neemt)? En hoe zou je er rekening mee houden wanneer tijden worden opgeslagen in PST versus PDT? Hoe zou je het weten? (Hint:zonder waarschijnlijk honderden regels extra code om die ene vraag te beantwoorden, niet ).

Om de time-out in de juiste tijdzone te krijgen, voegt u eenvoudig een mutatorfunctie toe aan het model zelf:

use Carbon\Carbon;

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

Nu, wanneer u $myModel->created_at . doet het zal op magische wijze worden omgezet in de juiste tijdzone, maar u houdt nog steeds UTC in uw database, wat zeker zijn voordelen heeft ten opzichte van andere tijdzones voor permanente opslag.

Wilt u gebruikers hun eigen tijdzones laten instellen? Verander de functie in dit:

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()
    ;
}

En alle complexiteit van het veranderen van tijdzones, al dan niet rekening houden met zomertijd, wordt van je geabstraheerd en je kunt vergeten dat het zelfs moet gebeuren.

Voor meer informatie over Laravel mutators / accessors, bekijk de documentatie .



  1. PHP:MySQL-query dupliceert update zonder reden

  2. Controleer of dit duplicaat is

  3. MySQL LIKE-query met onderstrepingsteken

  4. Herstel uw WordPress-database met WP-CLI