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 kembali SYSTEM
jika MySQL diatur ke budak ke zona waktu sistem, yang kurang bermanfaat. Karena Anda menggunakan PHP, jika jawabannya dari MySQL SYSTEM
, Anda dapat menanyakan sistem apa zona waktu yang digunakannya date_default_timezone_get
. (Tentu saja, seperti yang ditunjukkan VolkerK, PHP mungkin berjalan di server yang berbeda, tetapi seperti asumsi, dengan asumsi server web dan server DB yang diajaknya diatur ke [jika tidak benar-benar di ] zona waktu yang sama bukanlah lompatan besar .) Tapi berhati-hatilah (seperti halnya MySQL), Anda dapat mengatur zona waktu yang digunakan PHP (date_default_timezone_set
), yang berarti dapat melaporkan nilai yang berbeda dari yang digunakan OS. Jika Anda mengendalikan kode PHP, Anda harus tahu apakah Anda melakukan itu dan baik-baik saja.
Tetapi seluruh pertanyaan tentang zona waktu apa yang digunakan server MySQL mungkin bersinggungan, karena bertanya pada server zona waktu mana yang memberitahu Anda sama sekali tidak ada data tentang data dalam database. Baca terus untuk detail:
Diskusi lebih lanjut :
Jika Anda mengendalikan server, tentu saja Anda dapat memastikan bahwa zona waktu adalah jumlah yang diketahui. Jika Anda tidak bisa 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 operasi lebih lanjut (seperti now()
) akan menggunakan GMT.
Namun, perlu diketahui bahwa nilai waktu dan tanggal tidak 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)
Sehingga mengetahui zona waktu dari 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 tanggal dalam data database menggunakan. Anda mungkin memilih untuk berasumsi mereka ditulis menggunakan zona waktu server, tetapi asumsi itu mungkin saja cacat. Untuk mengetahui zona waktu dari setiap tanggal atau waktu yang disimpan dalam data, Anda harus memastikan bahwa mereka disimpan dengan informasi zona waktu atau (seperti yang saya lakukan) memastikan mereka selalu dalam GMT.
Mengapa asumsi data ditulis menggunakan zona waktu server cacat? Ya, untuk satu hal, data mungkin ditulis menggunakan koneksi yang menetapkan zona waktu berbeda. Basis data mungkin telah dipindahkan dari satu server ke yang lain, di mana server berada di zona waktu yang berbeda (saya menemukan bahwa ketika saya mewarisi database yang telah pindah dari Texas ke California). Tetapi bahkan jika data ditulis di server, dengan zona waktu saat ini, masih ambigu. Tahun lalu, di Amerika Serikat, Daylight Savings Time dimatikan pukul 02:00 pada tanggal 1 November. Misalkan server saya ada di California menggunakan zona waktu Pasifik dan saya memiliki nilai2009-11-01 01:30:00
dalam database. Kapan itu? Apakah itu 1:30 pagi PDT 1 November, atau 1:30 pagi 1 November PST (satu jam kemudian)? Anda sama sekali tidak memiliki cara untuk mengetahui. Moral: Selalu simpan tanggal / waktu dalam GMT (yang tidak melakukan DST) dan konversikan ke zona waktu yang diinginkan jika diperlukan.