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.
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.
tidak peduli apa zona waktu sesi MySQL saat ini di:
SELECT
CONVERT_TZ(`timestamp_field`, @@session.time_zone, '+00:00') AS `utc_datetime`
FROM `table_name`
Anda juga dapat mengatur zona waktu sesi global atau saat ini menjadi UTC dan kemudian memilih stempel waktu seperti:
SELECT `timestamp_field` FROM `table_name`
SELECT UTC_TIMESTAMP();
SELECT UTC_TIMESTAMP;
SELECT CONVERT_TZ(NOW(), @@session.time_zone, '+00:00');
Contoh hasil: 2015-03-24 17:02:41
SELECT NOW();
SELECT CURRENT_TIMESTAMP;
SELECT CURRENT_TIMESTAMP();
SELECT @@system_time_zone;
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
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
Ini akan kembali 02:00:00 jika zona waktu Anda adalah +2: 00.
SELECT UNIX_TIMESTAMP(NOW());
SELECT UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`
SELECT UNIX_TIMESTAMP(CONVERT_TZ(`utc_datetime`, '+00:00', @@session.time_zone)) FROM `table_name`
SELECT FROM_UNIXTIME(`unix_timestamp_int`) FROM `table_name`
SELECT CONVERT_TZ(FROM_UNIXTIME(`unix_timestamp_int`), @@session.time_zone, '+00:00')
FROM `table_name`
SELECT DATE_ADD('1970-01-01 00:00:00',INTERVAL -957632400 SECOND)
Catatan: Zona waktu dapat diatur dalam 2 format:
Zona waktu bernama hanya dapat digunakan jika tabel informasi zona waktu di database mysql telah dibuat dan diisi.
default_time_zone='+00:00'
atau
timezone='UTC'
Untuk melihat nilai apa yang ditetapkan
SELECT @@global.time_zone;
Untuk menetapkan nilai untuk itu gunakan salah satu:
SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';
SET @@global.time_zone='+00:00';
SELECT @@session.time_zone;
Untuk mengaturnya gunakan salah satu:
SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
SET @@session.time_zone = "+00:00";
"@@ 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:
SELECT
CONVERT_TZ(`timestamp_field`, TIMEDIFF(NOW(), UTC_TIMESTAMP), '+00:00') AS `utc_datetime`
FROM `table_name`
Agar CONVERT_TZ
dapat bekerja, Anda perlu tabel zona waktu untuk diisi
SELECT * FROM mysql.`time_zone` ;
SELECT * FROM mysql.`time_zone_leap_second` ;
SELECT * FROM mysql.`time_zone_name` ;
SELECT * FROM mysql.`time_zone_transition` ;
SELECT * FROM mysql.`time_zone_transition_type` ;
Jika kosong, isilah dengan menjalankan perintah ini
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
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
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
(if the above gives error "data too long for column 'abbreviation' at row 1")
mysql_tzinfo_to_sql /usr/share/zoneinfo > /tmp/zut.sql
echo "SET SESSION SQL_MODE = '';" > /tmp/mysql_tzinfo_to.sql
cat /tmp/zut.sql >> /tmp/mysql_tzinfo_to.sql
mysql --defaults-file=/etc/mysql/my.cnf --user=verifiedscratch -p mysql < /tmp/mysql_tzinfo_to.sql
(pastikan server Anda aturan pertama up to date zdump -v Europe/Moscow | grep 2011
https://chrisjean.com/updating-daylight-saving-time-on-linux/ )
SELECT
tzn.Name AS tz_name,
tztt.Abbreviation AS tz_abbr,
tztt.Is_DST AS is_dst,
tztt.`Offset` AS `offset`,
DATE_ADD('1970-01-01 00:00:00',INTERVAL tzt.Transition_time SECOND) AS transition_date
FROM mysql.`time_zone_transition` tzt
INNER JOIN mysql.`time_zone_transition_type` tztt USING(Time_zone_id, Transition_type_id)
INNER JOIN mysql.`time_zone_name` tzn USING(Time_zone_id)
-- WHERE tzn.Name LIKE 'Europe/Moscow' -- Moscow has weird DST changes
ORDER BY tzt.Transition_time ASC
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 dan CEST
akan menjadi musim panas sedangkan +01: 00 akan selalu menjadi UTC
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:
table
set modified
= '2016-07-07 08:10 +00: 00'
UNIX_TIMESTAMP(NOW());
serta semua penggunaan Anda di CONVERT_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.
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
date_default_timezone_set("America/Los_Angeles");
dan mysql_query("SET time_zone='" . date('P', time()) . "'");
Bekerja sangat elegan!