2016-03-18 24 views
2

Bazı zamanlar ilgili özellikler üzerinde çalışıyorum ve her zaman UTC zamanlarını kullanıp zaman damgalarını tutarlılık için tamsayı olarak depolamayı tercih ediyorum.PHP mktime ve saat dilimi

Ancak, mktime kullandığımda, o anda ayarlanan saat diliminin mktime dönüş değeri üzerinde bir etkisi olduğunu fark ettim.

verilen argümanları unix zaman damgasını döner: belgelerine ben mktime Dönemden beri saniye sayısını döndürmek gerekiyordu anlıyoruz. Bu zaman damgası, Unix Epoch (1 Ocak 1970 00:00:00 GMT) ile belirtilen süre arasındaki saniye sayısını içeren uzun bir tamsayıdır. http://php.net/manual/en/function.mktime.php

Ancak mktime anda ayarlanır saat dilimini içeren gibi görünüyor. Aşağıdaki kodu kullanırken:

1451606400 - 1451566800 = 39600/(60*60) = 11 
:

1451606400 
1451566800 

Hangi exacly 11 saat fark gibi görünüyor:

date_default_timezone_set('UTC'); 
$time = mktime(0, 0, 0, 1, 1, 2016); 
echo "{$time}\n"; 

date_default_timezone_set('Australia/Sydney'); 
$time = mktime(0, 0, 0, 1, 1, 2016); 
echo "{$time}\n"; 

Ben iki zaman aynı gibi VALES ama görünüşe değiller beklenebilir

mktime ile ilgili doğru bir şekilde neyi anlamadım ve/veya saat dilimi neden mktime kullanılırken hesaba katılır?

cevap

5

o (o tarih ve zaman geldiğinde PHP bana anlamlı geldi olmamıştı) 'dir yoludur ancak

Özdeş olan alternatif fonksiyon gmmktime() orada neden olduğunu söyleyemem Geçirilen parametreler hariç mktime() bir GMT tarihini temsil eder. gmmktime() dahili olarak mktime() işlevini kullanır, böylece türetilmiş yerel saatte yalnızca geçerli olan süreler kullanılabilir.

zamanda nasıl mktime(), gmmktime() ve time() çalışmalarını açıklayan bir comment on the PHP documentation for this function yoktur. Aslında, bir UNIX zaman damgasının kendisi bir saat dilimi taşımasa bile, zaman dilimlerinde her zaman düşündüğünüzü varsayıyorlar.

+1

Ouch. Bu oldukça berbat. Tek yapmaları gereken, her zaman UTC'yi her zaman işlevinde kullanmak ve sadece "gösteriliyor" zamanları olduğunda bir zaman dilimi kullanmaktı. Sanırım PHP'nin "geçmişi" nedeniyle olduğu gibi ... Cevabınız için teşekkürler! – Luke