sql >> Database teknologi >  >> RDS >> Mysql

Hvordan opdaterer man tidszonen for tidsstemplerne (created_at and updated_at) administreret af Laravel Eloquent?

Jeg ved godt, at dette spørgsmål er en smule forældet, men jeg faldt over det, da jeg prøvede at finde på den samme løsning, og ville gerne dele, hvordan jeg gik til at løse det.

Mit råd vil være ikke at ændre den tidszone, som beskederne er gemt i. Gem dem i databasen som UTC. Ved at holde dit lager indstillet til en konstant referenceramme og derefter konvertere det til den tidszone, du har brug for, vil det spare dig for en masse hovedpine i det lange løb.

Som et eksempel på en af ​​disse hovedpine, forestil dig to personer, der forsøger at koordinere et mødetidspunkt i forskellige tidszoner, hvor den ene observerer sommertid og den anden ikke, og du skal vise tiden i hver brugers lokale tid. Hvor svært ville det være at konvertere din lagrede PDT-tid til at sige America/Cayman (som ikke overholder sommertid)? Og hvordan vil du tage højde for, hvornår tider er gemt i PST vs PDT? Hvordan ville du vide det? (Tip:uden sandsynligvis hundredvis af linjer ekstra kode bare for at besvare det ene spørgsmål, vil du ikke ).

For at få timeout i den korrekte tidszone, skal du blot tilføje en mutatorfunktion på selve modellen:

use Carbon\Carbon;

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

Nu, når du gør $myModel->created_at det vil på magisk vis blive konverteret til den korrekte tidszone, men du beholder stadig UTC i din database, som helt sikkert har sine fordele i forhold til andre tidszoner for vedvarende lagring.

Vil du lade brugerne indstille deres egne tidszoner? Skift funktionen til dette:

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

Og al kompleksiteten ved at ændre tidszoner, tage højde for sommertid eller ej, er abstraheret fra dig, og du kan glemme, at det endda skal ske.

For mere information om Laravel-mutatorer/-accessorer, se dokumentationen .



  1. Android:Sådan indlæses et billede dynamisk fra serveren ved dets navn fra SQlite

  2. hvordan man får rowNum-lignende kolonne i sqlite IPHONE

  3. Den maksimale udførelsestid på 30 sekunder er overskredet

  4. mysql forespørgselsovervågningsværktøj