Kılavuzdan ( bölüm 9.6 ):
Genel ve istemciye özgü saat dilimlerinin geçerli değerleri şu şekilde alınabilir:
mysql> SELECT @@global.time_zone, @@session.time_zone;
DüzenleSYSTEM
MySQL, sistemin saat dilimine yardımcı olacak şekilde ayarlanmışsa, yukarıdaki değer döndürülür . PHP kullanarak konum beri MySQL gelen cevap ise, SYSTEM
o zaman ne zaman dilimi sistemini sorabilirsiniz o oluyor aracılığı ile date_default_timezone_get
. VolkerK belirttiği gibi (Elbette, PHP farklı bir sunucuda çalışıyor olabilir, ancak varsayımlar giderken, web sunucusu ve edilmektedir konuşuyor sunucusunun DB varsayarak ayarlı [değilse aslında içinde ] Aynı zaman dilimi bir değil büyük bir sıçrama.) Ancak dikkat edin (MySQL'de olduğu gibi), PHP'nin kullandığı zaman dilimini ayarlayabilirsiniz (date_default_timezone_set
) anlamına gelir. Bu, işletim sisteminin kullandığından farklı bir değer rapor edebileceği anlamına gelir. PHP kodunu kontrol ediyorsanız, bunu yapıp yapmadığınızı bilmeli ve iyi olmalısınız.
Ancak MySQL sunucusunun hangi saat dilimini kullandığına dair tüm soru teğet olabilir, çünkü sunucuya hangi saat diliminde olduğunu sormak , veritabanındaki veriler hakkında kesinlikle hiçbir şey söylemez . Ayrıntılar için okumaya devam edin:
Daha fazla tartışma :
Sunucuyu kontrol ediyorsanız, elbette saat diliminin bilinen bir miktar olduğundan emin olabilirsiniz. Sunucunun kontrolü sizde değilse, bağlantınız tarafından kullanılan saat dilimini şu şekilde ayarlayabilirsiniz :
set time_zone = '+00:00';
Bu, saat dilimini GMT'ye ayarlar, böylece diğer işlemler (gibi now()
) GMT'yi kullanır.
Not olsa da, o zaman ve tarih değerleri vardır değil MySQL zaman dilimi bilgileri ile saklanır:
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)
Sunucunun dilimini bilerek hemen zaman olsun fonksiyonları açısından yalnızca önemlidir Yani örneğin now()
, unix_timestamp()
vb .; veritabanı verilerindeki tarihlerin saat dilimini ne kullandığına dair hiçbir şey söylemez. Sunucunun saat dilimini kullanarak yazıldığını varsaymayı seçebilirsiniz , ancak bu varsayım hatalı olabilir. Verilerde depolanan herhangi bir tarih veya saatin saat dilimini bilmek için, saat dilimi bilgileriyle birlikte depolandıklarından veya (yaptığım gibi) her zaman GMT'de olduklarından emin olmalısınız.
Verilerin neden sunucunun saat dilimi hatalı yazıldığını varsayalım? Bir kere, veriler farklı bir saat dilimi ayarlayan bir bağlantı kullanılarak yazılmış olabilir. Veritabanı bir sunucudan diğerine taşınmış olabilir, burada sunucular farklı zaman dilimlerinde idi (Teksas'tan Kaliforniya'ya taşınan bir veritabanını devraldığımda buna rastladım). Ancak veriler sunucuda, geçerli saat dilimiyle yazılsa bile , yine de belirsizdir. Geçen yıl, Amerika Birleşik Devletleri'nde, Yaz Saati Uygulaması 1 Kasım günü saat 02: 00'de kapatıldı. Sunucumun Pasifik saat dilimini kullanarak Kaliforniya'da olduğunu ve2009-11-01 01:30:00
veritabanında. Ne zamandı? Bu 1 Kasım 1 Kasım PDT mi, 1:30 am 1 Kasım PST miydi (bir saat sonra)? Kesinlikle bilmenin yolu yok. Ahlaki: Tarihleri / saatleri her zaman GMT'de (DST yapmayan) saklayın ve gerektiğinde / istediğiniz zaman dilimine dönüştürün.