Dari manual (bagian 9.6 ):
Nilai saat ini dari zona waktu global dan khusus klien dapat diambil seperti ini:
mysql> SELECT @@global.time_zone, @@session.time_zone;
Sunting Di atas mengembalikan SYSTEM
jika MySQL diatur untuk menggunakan zona waktu sistem, yang kurang membantu. Karena Anda menggunakan PHP, jika jawaban dari MySQL adalah SYSTEM
, Anda kemudian dapat menanyakan kepada sistem apa zona waktu ini menggunakan melalui date_default_timezone_get
. (Tentu saja, seperti yang ditunjukkan VolkerK, PHP mungkin berjalan di server yang berbeda, tetapi seperti asumsi yang berlaku, dengan asumsi server web dan server DB yang diajak bicara disetel ke [jika tidak benar-benar di ] zona waktu yang sama tidak besar lompatan.) Namun berhati-hatilah bahwa (seperti halnya MySQL), Anda dapat mengatur zona waktu yang digunakan PHP (date_default_timezone_set
), yang berarti mungkin melaporkan nilai yang berbeda dari yang digunakan OS. Jika Anda mengendalikan kode PHP, Anda harus tahu apakah Anda melakukannya dan baik-baik saja.
Tetapi seluruh pertanyaan tentang zona waktu apa yang digunakan server MySQL mungkin merupakan hal yang bersinggungan, karena menanyakan kepada server zona waktu apa yang digunakan memberi tahu Anda sama sekali tidak ada tentang data yang ada di database. Baca terus untuk detailnya:
Diskusi lebih lanjut :
Jika Anda mengendalikan server, tentu saja Anda dapat memastikan bahwa zona waktu adalah jumlah yang diketahui. Jika Anda tidak mengendalikan server, Anda dapat mengatur zona waktu yang digunakan oleh koneksi Anda seperti ini:
set time_zone = '+00:00';
Itu menetapkan zona waktu ke GMT, sehingga setiap operasi lebih lanjut (seperti now()
) akan menggunakan GMT.
Namun, perhatikan bahwa nilai waktu dan tanggal bukan disimpan dengan informasi zona waktu di MySQL:
mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)
mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)
mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 | <== Note, no change!
+---------------------+
1 row in set (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 08:32:38 | <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)
Jadi mengetahui zona waktu server hanya penting dalam hal fungsi yang mendapatkan waktu sekarang, seperti now()
, unix_timestamp()
, dll.; itu tidak memberi tahu Anda apa pun tentang zona waktu apa yang digunakan tanggal dalam data database. Anda dapat memilih untuk berasumsi mereka ditulis menggunakan zona waktu server, tetapi asumsi itu mungkin salah. Untuk mengetahui zona waktu dari setiap tanggal atau waktu yang tersimpan dalam data, Anda harus memastikan bahwa tanggal atau waktu tersebut disimpan dengan informasi zona waktu atau (seperti yang saya lakukan) memastikan mereka selalu dalam GMT.
Mengapa dengan asumsi data ditulis menggunakan zona waktu server cacat? Nah, untuk satu hal, data mungkin telah ditulis menggunakan koneksi yang mengatur zona waktu yang berbeda. Basis data mungkin telah dipindahkan dari satu server ke server lain, di mana server berada di zona waktu yang berbeda (saya mengalaminya ketika saya mewarisi database yang telah dipindahkan dari Texas ke California). Tapi meskipun data ditulis di server, dengan zona waktu saat ini, masih ambigu. Tahun lalu, di Amerika Serikat, Daylight Savings Time dimatikan pada pukul 02:00 pada tanggal 1 November. Misalkan server saya di California menggunakan zona waktu Pasifik dan saya memiliki nilai 2009-11-01 01:30:00
dalam database. Kapan itu? Apakah itu 01:30 PDT 1 November, atau 01:30 PST 1 November (satu jam kemudian)? Anda sama sekali tidak punya cara untuk mengetahuinya. Moral:Selalu simpan tanggal/waktu dalam GMT (yang tidak melakukan DST) dan ubah ke zona waktu yang diinginkan jika diperlukan.