Nasıl MySQL geçerli saat dilimini alabilirim?

6 Cevap php

MySQL böyle bir işlevi var ise herkes bilir?

UPDATE

Bu etmez çıkış geçerli herhangi bir bilgi:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+

Ya da belki MySQL kendisi biz sürece ben geçerli bilgi {sevmiyorum alabilirsiniz, PHP burada tutabilen, bu iyi, tam time_zone kurardım [(2)] edemez } ...

6 Cevap

Manuel (section 9.6):

The current values of the global and client-specific time zones can be retrieved like this:
mysql> SELECT @@global.time_zone, @@session.time_zone;

Edit Yukarıdaki döner SYSTEM MySQL daha az yararlı olan sistemin zaman dilimi, köle ayarlı ise. PHP kullanarak konum beri MySQL cevap SYSTEM ise, daha sonra it's üzerinden kullanarak ne timezone sistemini sorabilirsiniz date_default_timezone_get {[(5) ]}}] aynı zaman dilimi bir huge sıçrama değildir [aslında {[(6) değilse].) Ama ({(PHP kullanan dilimini ayarlayabilirsiniz) MySQL gibi sakının [(8)]} ), bu işletim sistemi kullanan daha farklı bir değer bildirebilir demektir. Eğer PHP kodu kontrol iseniz, size bu yaptığınızı olmadığını bilmek ve iyi olmalıdır.

Bunun içinde ne timezone sunucuyu soran absolutely nothing veritabanındaki veriler hakkında size söyler çünkü Ama MySQL sunucusu kullanarak hangi zaman dilimi içinde bütün soru, bir teğet olabilir. Detaylar için okumaya:

Further discussion:

Eğer sunucu kontrolü iseniz, tabii ki zaman dilimi bilinen bir miktar olduğundan emin olabilirsiniz. Eğer sunucu kontrolü değilseniz, sizin connection böyle tarafından kullanılan zaman dilimini ayarlayabilirsiniz:

set time_zone = '+00:00';

Başka işlemler (Örn: now()) GMT kullanacağını böylece, GMT zaman dilimini ayarlar.

Olsa da, bu zaman ve tarih değerleri not MySQL timezone bilgileri hafızaya Not:

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)

Yani sunucunun dilimi bilerek böyle now(), unix_timestamp(), vb gibi hemen zaman olsun fonksiyonları açısından sadece önemli değil; size veritabanı veri tarihleri ​​kullanarak ne timezone hakkında hiçbir şey söylemez. Sen assume onlar sunucunun dilimini kullanılarak yazılmıştır seçebilirsiniz, ama bu varsayım da kusurlu olabilir. Veri depolanan herhangi bir tarih veya saat dilimini bilmek için, onlar timezone bilgi depolanan veya (benim yaptığım gibi) onlar GMT hep konum sağlamak konum sağlamak için var.

Neden veri sunucunun dilimini kusurlu kullanılarak yazılmış üstleniyor? Peki, bir şey için, verileri farklı bir zaman dilimini bir bağlantıyı kullanarak yazılmış olabilir. Veritabanı sunucuları (I California Texas taşınmıştı bir veritabanı miras zaman o içine koştum) farklı saat dilimleri nerede başka, bir sunucudan taşınmış olabilir. Ama even if veri mevcut zaman dilimi ile, sunucu üzerinde yazılı, hala muğlak. Geçen yıl, Amerika Birleşik Devletleri, Yaz Saati 1 Kasım tarihinde 02:00 kapalıydı. Benim sunucu Pasifik dilimini kullanarak Kaliforniya ve ben veritabanında 2009-11-01 01:30:00 değerine sahip varsayalım. Ne zaman oldu? Miydi 01:30 1 Kasım PDT, ya da 01:30 1 Kasım PST (bir saat sonra)? Sen bilmenin hiçbir yolu yoktur. Kıssadan hisse: Her zaman (DST yapmaz ki) GMT tarihleri ​​/ süreleri depolamak ve gerektiğinde / gibi istenilen zaman dilimi dönüştürmek.

Aşağıdaki sorgu geçerli oturum dilimini döndürür.

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));

Simply SELECT @@system_time_zone;

İade PST (veya ne olursa olsun sisteme alakalı).

If you're trying to determine the session timezone you can use this query:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);

Bu sistem zaman dilimi farklıysa oturum dilimini dönecektir Hangi.

Jakub Vrána (yaratıcısı veya Adminer ve NotORM) geçerli dilimi kullanımını seçmek için, yorumların bahseder gibi:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Bu dönecektir: 02:00:00 sizin dilimi ise +2:00

Burada bir Klavuzu yaptı: Should MySQL have its timezone set to UTC?

Sadece Sisteminin dilimini değiştirerek sonra mysqld yeniden başlatmanız gerekir ..

MySQL Küresel zaman dilimi Sistemi dilimini alır. Eğer sistem böyle bir özelliği değiştirdiğinizde, sadece mysqld yeniden başlatılması gerekir.

İşte bu.

http://Agilewebhosting.com