Zaman farklı zaman dilimleri içinde UNIX_TIMESTAMP bir datetime alan ofset değil almak nasıl?

4 Cevap php

Ben kullanıcılar mesaj gönderebilir küçük bir forum inşa etmişlerdir. Benim sunucu Amerika Birleşik Devletleri'nde, ama forum için userbase Tayvan (15 saat) 'dir.

MM: forma Birisi Mesajları, ben YYYY-AA-GG SS benim mySQL veritabanında zaman saklarken SS. Ben veritabanında baktığımızda, zaman uygun zaman (Tayvan kişi yayınlanmıştır zaman) görüntüler.

Ben veritabanından tarihi almak için UNIX_TIMESTAMP kullveığınızda, ancak, zaman değişmiş.

Örnek:

  1. Ben foruma bir şeyler göndermek. Benim bilek izlemek datetime (Tayvan Zaman) 11:24 2009/10/02 edilir
  2. Ben veritabanında bakmak ve datetime 11:24 2009/10/02 diyor (benim kol saati gibi aynı zamvea. Iyi!)
  3. Web siteme tarihini görüntülemek için UNIX_TIMESTAMP kullveığınızda sonra, o 2009-10-03 04:22 olarak gösterir (kötü! bir ofset uygulamalı)

Is there a way I can get UNIX_TIMESTAMP to stop converting the time (applying an offset) when I query the date from the database?

Extra Info:
I'm using PHP
I have set the timezone in my PHP to Taiwan (date.timezone = Asia/Taipei)
If a user is in another timezone than Taiwan, I want it to convert the time to Taipei time. The site is nearly 100% Taiwan used so I just want Taiwan time to show all the time even if they're in another timezone.
I display the date in lots of vardıras around the site in different date() formats.
Basically everything works great except that when I use UNIX_TIMESTAMP to query the data out, it applies an offset to the time.

Teşekkürler!

4 Cevap

Ben sadece Unix zaman dönüştürmeden veritabanından tarih almak için olası bir çözüm bulundu, ve sonra sadece strtotime kullanarak () var; Unix zaman dönüştürmek için. Temelde yerine kullanarak sql dönüştürme, ben php kullanarak dönüştürme değilim. Strtotime () <: Ben bu konuda sevmiyorum tek şey vardır Ben bu fonksiyonu ne kadar güvenilir emin değilim, ve ben UNIX_TIMESTAMP (doh!) istimal yaklaşık 100 yerlere gitmek ve değiştirmek zorunda

Başka yolları var mı?

Etmediyle MySQL, aksi takdirde yaşadığınız sorunları açıklar sistemin varsayılan saat dilimi ayarını alır; Daha fazla ayrıntı için MySQL'in time zone başvuru kılavuzuna bir göz atın. Benim geçmiş deneyimlerine dayanarak ben UTC tarih ve saati depolamak için iyi bir seçimdir sonuca vardım; kullanıcıya gösterirken, bunlar kullanıcının zaman dilimi dönüştürülür.

Mümkünse, date_default_timezone_set() kullanarak PHP dilimini yapılandırmak, UTC DB tüm tarih ve saat girdilerini değiştirmek ve bunu kullanıcıya işlerken ve de veritabanında saklarken düzgün dönüştürmek için emin olun. UTC değerleri saklamak bir seçenek değilse, sadece bir zaman dilimi referans kılavuzunu UTC ile aynı şekilde takip ederek onları dönüştürmek olabilir.

Yapmanız gereken DateTime dönüştürmek için veritabanından ham tarih ve saati kapmak ve sonra PHP'nin kullanmaktır. De DateTimeZone bir göz atın.

Ben bu sorun için bulduk en iyi bu kullanıyor:

UNIX_TIMESTAMP (şimdi ikinci, utc_timestamp (), ()) (CONVERT_TZ (<< >>, '+15:00', '+00:00')) + TIMESTAMPDIFF SEÇİMİ

Example: I want to get the timestamp of 31-may-2012 at 23:59:59, Local time. SELECT UNIX_TIMESTAMP(CONVERT_TZ('2012-05-31 23:59:59','+15:00','+00:00')) +TIMESTAMPDIFF(second,utc_timestamp(), now())

Ben localtime karşılık, zaman damgası GMT-0 olsun bu şekilde.

MySQL "olduğu gibi", aynı zamanda bu yüzden onları okur, ama UNIX_TIMESTAMP bilgisayarınızın yerel saatine olarak herhangi bir giriş tarihleri ​​davranır ve yerel saat dilimi farkı uygulanacaktır anlamı UTC / GMT damgaları onları dönüştürür, işlemek eğer şimdi damgaları döndü tarihleri ​​yazıyor mysql yoluyla örneğin. php date () yine istenmeyen sonuçlar üretecek, (bunu yapmaz hangi not gmtime (orada da)) ofset yerel dilimini geçerli olacaktır.

Eğer db de aynı tarih istiyorsanız bu sanki ne olursa olsun sunucu / yerel saat diliminin tam sayısını alacak kadar Ama sen, (UNIX_TIMESTAMP önce oturum dilimini çıkarma yapacak bu şu hile) uygular ile alabilirsiniz GMT zaman.

mysql> SELECT UNIX_TIMESTAMP(CONVERT_TZ("2013-05-27","GMT",@@session.time_zone));
+--------------------------------------------------------------------+
| UNIX_TIMESTAMP(CONVERT_TZ("2013-05-27","GMT",@@session.time_zone)) |
+--------------------------------------------------------------------+
|                                                         1369612800 |
+--------------------------------------------------------------------+
1 row in set (0.00 sec)

Başka bir çözüm 0 (GMT) sunucuları veya oturum dilimini olacaktır, bu yüzden yer alarak gerçek bir dönüşüm olacaktır.