Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara memperbarui zona waktu untuk stempel waktu (created_at dan updated_at) yang dikelola oleh Laravel Eloquent?

Saya tahu pertanyaan ini agak ketinggalan zaman, tetapi saya menemukannya ketika mencoba menemukan solusi yang sama, dan ingin berbagi bagaimana saya menyelesaikannya.

Saran saya adalah tidak mengubah zona waktu tempat pesan disimpan. Simpan di database sebagai UTC. Menjaga penyimpanan Anda diatur ke kerangka acuan yang konstan dan kemudian mengonversinya ke zona waktu apa pun yang Anda inginkan untuk menampilkannya akan menghemat banyak sakit kepala dalam jangka panjang.

Sebagai contoh dari salah satu sakit kepala itu, bayangkan dua orang mencoba mengoordinasikan waktu rapat di zona waktu yang berbeda di mana satu mengamati DST dan satu tidak dan Anda perlu menampilkan waktu dalam waktu lokal setiap pengguna. Seberapa sulitkah untuk mengubah waktu PDT Anda yang tersimpan untuk mengatakan, Amerika/Cayman (yang tidak mengamati DST)? Dan bagaimana Anda memperhitungkan waktu disimpan dalam PST vs PDT? Bagaimana Anda tahu? (Petunjuk:tanpa mungkin ratusan baris kode tambahan hanya untuk menjawab satu pertanyaan itu, Anda tidak akan ).

Untuk mendapatkan waktu habis di zona waktu yang benar, cukup tambahkan fungsi mutator pada model itu sendiri:

use Carbon\Carbon;

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

Sekarang, setiap kali Anda melakukan $myModel->created_at itu akan secara ajaib diubah menjadi zona waktu yang benar, tetapi Anda masih menyimpan UTC di database Anda yang pasti memiliki kelebihan dibandingkan zona waktu lain untuk penyimpanan persisten.

Ingin membiarkan pengguna mengatur zona waktu mereka sendiri? Ubah fungsinya menjadi ini:

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

Dan semua kerumitan mengubah zona waktu, memperhitungkan penghematan siang hari atau tidak, disarikan dari Anda dan Anda dapat melupakan bahwa itu bahkan harus terjadi.

Untuk informasi selengkapnya tentang mutator/aksesor Laravel, lihat dokumentasi .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kesalahan sintaks 'PDOException' atau pelanggaran akses:1064 Anda memiliki kesalahan dalam sintaks SQL Anda; memeriksa

  2. Daftar semua tabel yang berisi nama kolom yang diberikan

  3. Cara memasukkan nilai dalam tabel dengan kolom dinamis Jdbc/Mysql

  4. Menginstal MySQL di CentOS 7

  5. Meniru klausa MySQL LIMIT di Microsoft SQL Server 2000