PHP / MySQL UTC olarak datetime saklanması

4 Cevap php

Her yerde ben bir kullanıcının zaman dilimi için zaman dönüştürme hakkında okumak en iyi yöntem o zaman sadece bu zamana ofset kullanıcının dilimini eklemek UTC tarih ve saati depolamak için olduğunu söylüyor.

Nasıl UTC zaman bir tarih saklayabilirsiniz? Ben MySQL DATETIME alanını kullanın.

Benim PHP kodu MySQL için yeni bir kayıt eklerken now() MySQL DATETIME eklemek için kullanabilirsiniz.

Ben UTC zamanı saklamak için now() daha farklı bir şey kullanmak gerekir?

4 Cevap

http://dba.stackexchange.com/questions/20217/mysql-set-utc-time-as-default-timestamp

Quoting all the answer from above link in case of delete:

CURRENT_TIMESTAMP UTC olarak depolanan ancak geçerli saatle alınır emin @ ypercube yorumuna ile birlikte gitmek için, alımı için --default_time_zone seçeneği ile sunucunun saat dilimi ayarını etkileyebilir. Bu alım her zaman UTC olmasını sağlar.

Varsayılan olarak, seçenek sistem zaman dilimi ayarlanır nasıl SYSTEM '(ki olabilir veya UTC olmayabilir!):

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 16:28:45 |
+---------------------+
1 row in set (0.00 sec)

Dinamik bu ayarlayabilirsiniz:

mysql> SET @@session.time_zone='+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | +00:00              |
+--------------------+---------------------+
1 row in set (0.00 sec)

Ya da kalıcı my.cnf:

[mysqld]
**other variables**
default_time_zone='+00:00'

Sunucu yeniden başlatın ve değişimi göreceksiniz:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| +00:00             | +00:00              |
+--------------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 20:27:50 |
+---------------------+
1 row in set (0.01 sec)

Ben UTC zaman diliminde tarih ekleme öneririm. Bu (.. Yaz saati sorunları vb) size gelecekte baş ağrısı bir çok kazandıracak

"INSERT INTO abc_table (registrationtime) VALUES (UTC_TIMESTAMP())"

Benim veri sorgulayabilir zaman aşağıdaki PHP komut dosyasını kullanın

<?  while($row = mysql_fetch_array($registration)){ 

  $dt_obj = new DateTime($row['message_sent_timestamp']." UTC");
  $dt_obj->setTimezone(new DateTimeZone('Europe/Istanbul'));
  echo $formatted_date_long=date_format($dt_obj, 'Y-m-d H:i:s'); } ?>

Sen mevcut php timezones Burada biriyle DateTimeZone değerini değiştirebilirsiniz:

NOW() size veritabanı çalıştıran sistemi (ofset dilimine dahil) zaman verir. MySQL Reference Manual açıklandığı gibi UTC_TIMESTAMP() kullanmak gerekir UTC tarih / saati almak için.