sql >> Databasteknik >  >> RDS >> Mysql

Hur uppdaterar man tidszonen för tidsstämplarna (created_at och updated_at) som hanteras av Laravel Eloquent?

Jag vet att den här frågan är lite föråldrad, men jag snubblade över den när jag försökte komma på samma lösning och ville dela med mig av hur jag gick tillväga för att lösa den.

Mitt råd är att inte ändra tidszonen som meddelandena lagras i. Lagra dem i databasen som UTC. Om du håller ditt lagringsutrymme inställt på en konstant referensram och sedan konverterar det till vilken tidszon du än behöver det visas i kommer du att spara massor av huvudvärk i det långa loppet.

Som ett exempel på en av dessa huvudvärk, föreställ dig två personer som försöker koordinera en mötestid i olika tidszoner där en observerar sommartid och en inte gör det och du måste visa tiden i varje användares lokala tid. Hur svårt skulle det vara att konvertera din lagrade PDT-tid till att säga America/Cayman (som inte observerar sommartid)? Och hur skulle du ta hänsyn till när tider lagras i PST vs PDT? Hur skulle du veta? (Tips:utan förmodligen hundratals rader med extra kod bara för att svara på den frågan, gör du inte ).

För att få timeout i rätt tidszon, lägg helt enkelt till en mutatorfunktion på själva 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 kommer magiskt att omvandlas till rätt tidszon, men du behåller fortfarande UTC i din databas som definitivt har sina fördelar jämfört med andra tidszoner för beständig lagring.

Vill du låta användare ställa in sina egna tidszoner? Ändra funktionen till detta:

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

Och all komplexiteten med att ändra tidszoner, att ta hänsyn till sommartid eller inte är abstraherat från dig och du kan glömma att det till och med måste hända.

För mer information om Laravel-mutatorer/tillbehör, kolla in dokumentationen .



  1. Visningar i SQL Server

  2. När du använder GETDATE() på många ställen, är det bättre att använda en variabel?

  3. Lagring av hexadecimala värden som binär i MySQL

  4. Dela funktion i oracle till kommaseparerade värden med automatisk sekvens