Tindak lanjuti pertanyaan /server/191331/should-servers-have-their-timezone-set-to-gmt-utc
Haruskah zona waktu MySQL diatur ke UTC atau haruskah zona waktu itu sama dengan server atau PHP ditetapkan? (Jika bukan UTC)
Apa pro dan kontra?
Tindak lanjuti pertanyaan /server/191331/should-servers-have-their-timezone-set-to-gmt-utc
Haruskah zona waktu MySQL diatur ke UTC atau haruskah zona waktu itu sama dengan server atau PHP ditetapkan? (Jika bukan UTC)
Apa pro dan kontra?
Jawaban:
Tampaknya tidak masalah zona waktu apa yang ada di server selama Anda memiliki waktu yang tepat untuk zona waktu saat ini, ketahui zona waktu kolom waktu yang Anda simpan, dan mengetahui masalah dengan waktu musim panas.
Di sisi lain, jika Anda memiliki kontrol zona waktu dari server tempat Anda bekerja, maka Anda dapat mengatur semuanya ke UTC secara internal dan tidak pernah khawatir tentang zona waktu dan DST.
Berikut adalah beberapa catatan yang saya kumpulkan tentang cara bekerja dengan zona waktu sebagai bentuk lembar contekan untuk saya dan orang lain yang mungkin memengaruhi zona waktu apa yang akan dipilih orang untuk servernya dan bagaimana ia akan menyimpan tanggal dan waktu.
Cheatsheet Zona Waktu MySQL
Catatan:
GMT membingungkan detik, itulah sebabnya UTC ditemukan.
Peringatan! zona waktu regional yang berbeda mungkin menghasilkan nilai datetime yang sama karena waktu musim panas
Secara internal, kolom stempel waktu MySQL disimpan sebagai UTC tetapi ketika memilih tanggal, MySQL secara otomatis akan mengubahnya ke zona waktu sesi saat ini.
Saat menyimpan tanggal dalam timestamp, MySQL akan menganggap bahwa tanggal tersebut berada di zona waktu sesi saat ini dan mengubahnya menjadi UTC untuk penyimpanan.
Untuk memilih kolom cap waktu dalam format UTC
tidak peduli apa zona waktu sesi MySQL saat ini di:
Anda juga dapat mengatur zona waktu sesi global atau saat ini menjadi UTC dan kemudian memilih stempel waktu seperti:
Untuk memilih datetime saat ini di UTC:
Contoh hasil:
2015-03-24 17:02:41
Untuk memilih datetime saat ini di zona waktu sesi
Untuk memilih zona waktu yang ditetapkan saat server diluncurkan
Mengembalikan "MSK" atau "+04: 00" untuk waktu Moskow misalnya, ada (atau ada) bug MySQL di mana jika diatur ke offset numerik, itu tidak akan menyesuaikan waktu penghematan siang hari
Untuk mendapatkan zona waktu saat ini
Ini akan kembali 02:00:00 jika zona waktu Anda adalah +2: 00.
Untuk mendapatkan cap waktu UNIX saat ini (dalam detik):
Untuk mendapatkan kolom cap waktu sebagai cap waktu UNIX
Untuk mendapatkan kolom waktu UTC sebagai cap waktu UNIX
Dapatkan datzone zona waktu saat ini dari bilangan bulat waktu UNIX positif
Dapatkan datetime UTC dari cap waktu UNIX
Dapatkan datzone zona waktu saat ini dari bilangan bulat cap waktu UNIX negatif
Ada 3 tempat di mana zona waktu mungkin diatur di MySQL:
Catatan: Zona waktu dapat diatur dalam 2 format:
dalam file "my.cnf"
atau
@@ variabel global.time_zone
Untuk melihat nilai apa yang ditetapkan
Untuk menetapkan nilai untuk itu gunakan salah satu:
@@ session.time_zone variabel
Untuk mengaturnya gunakan salah satu:
"@@ global.time_zone variabel" dan "@@ session.time_zone variabel" mungkin mengembalikan "SYSTEM" yang berarti bahwa mereka menggunakan zona waktu yang diatur dalam "my.cnf".
Agar nama zona waktu berfungsi (bahkan untuk zona waktu standar) Anda harus mengatur tabel informasi zona waktu Anda harus diisi: http://dev.mysql.com/doc/refman/5.1/en/time-zone-support. html
Catatan: Anda tidak dapat melakukan ini karena akan mengembalikan NULL:
Siapkan tabel zona waktu mysql
Agar
CONVERT_TZ
dapat bekerja, Anda perlu tabel zona waktu untuk diisiJika kosong, isilah dengan menjalankan perintah ini
jika perintah ini memberi Anda kesalahan " data terlalu panjang untuk 'singkatan' kolom pada baris 1 ", maka itu mungkin disebabkan oleh karakter NULL yang ditambahkan pada akhir singkatan zona waktu
perbaikannya adalah menjalankan ini
(pastikan server Anda aturan pertama up to date
zdump -v Europe/Moscow | grep 2011
https://chrisjean.com/updating-daylight-saving-time-on-linux/ )Lihat riwayat transisi DST (Daylight Saving Time) penuh untuk setiap zona waktu
CONVERT_TZ
juga menerapkan perubahan DST yang diperlukan berdasarkan aturan dalam tabel di atas dan tanggal yang Anda gunakan.Catatan:
Menurut dokumen , nilai yang Anda tetapkan untuk time_zone tidak berubah, jika Anda menetapkannya sebagai "+01: 00" misalnya, maka time_zone akan ditetapkan sebagai offset dari UTC, yang tidak mengikuti DST, jadi itu akan tetap sama sepanjang tahun.
Hanya zona waktu yang disebutkan yang akan mengubah waktu selama waktu musim panas.
Singkatan seperti
CET
akan selalu menjadi waktu musim dingin danCEST
akan menjadi musim panas sedangkan +01: 00 akan selalu menjadiUTC
waktu + 1 jam dan keduanya tidak akan berubah dengan DST.The
system
zona waktu akan menjadi zona waktu dari mesin host di mana mysql diinstal (kecuali mysql gagal untuk menentukan itu)Anda dapat membaca lebih lanjut tentang bekerja dengan DST di sini
Pertanyaan-pertanyaan Terkait:
Sumber:
sumber
table
setmodified
= '2016-07-07 08:10 +00: 00'UNIX_TIMESTAMP(NOW());
serta semua penggunaan Anda diCONVERT_TZ()
mana salah satu parameternya adalah `@@ session.time_zone. Untuk mengkonversi datetimes UTC dengan andal ke cap waktu UNIX, Anda pada dasarnya harus mengatur time_zone sesi terlebih dahulu.Ini adalah contoh kerja:
sumber
PHP dan MySQL memiliki konfigurasi zona waktu default sendiri. Anda harus menyinkronkan waktu antara basis data dan aplikasi web Anda, jika tidak, Anda dapat menjalankan beberapa masalah.
Baca tutorial ini: Cara Menyinkronkan Zona Waktu PHP dan MySQL Anda
sumber
date_default_timezone_set("America/Los_Angeles");
danmysql_query("SET time_zone='" . date('P', time()) . "'");
Bekerja sangat elegan!Pro dan kontra cukup banyak identik. Itu tergantung pada apakah Anda menginginkan ini atau tidak.
Hati-hati, jika zona waktu MySQL berbeda dari waktu sistem Anda (misalnya PHP), membandingkan waktu atau pencetakan dengan pengguna akan melibatkan beberapa penyesuaian.
sumber