2016-09-05 18 views
13

PHP DateDiff ile ilgili bir sorunum var, her bir saat diliminin neden farklı sonuçlar döndürdüğünü anlamıyorum, örneğin bu durumda Prag, 0 ay, ve ABD 1 ay geri dönüyor.DateDiff her bir saat dilimi için farklı sonuç döndürüyor

Bu fark ve beklediğim gibi 1 ay (bunun yerine 1 ay eklediğimde 30 gün) nasıl iade ediyorum?

kod Avrupa/Prag:

date_default_timezone_set("Europe/Prague"); 
$from = new \DateTimeImmutable('2016-09-01'); 
$to = $from->add(new \DateInterval('P1M')); 
var_dump($from); 
var_dump($to); 
var_dump($from->diff($to)->m); 
var_dump($from->diff($to)->d); 

sonuç Avrupa/Prag:

object(DateTimeImmutable)#1 (3) { 
    ["date"]=> 
    string(26) "2016-09-01 00:00:00.000000" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(13) "Europe/Prague" 
} 
object(DateTimeImmutable)#3 (3) { 
    ["date"]=> 
    string(26) "2016-10-01 00:00:00.000000" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(13) "Europe/Prague" 
} 
int(0) 
int(30) 

-

kod ABD/Pasifik:

date_default_timezone_set("US/Pacific"); 
$from = new \DateTimeImmutable('2016-09-01'); 
$to = $from->add(new \DateInterval('P1M')); 
var_dump($from); 
var_dump($to); 
var_dump($from->diff($to)->m); 
var_dump($from->diff($to)->d); 

ABD neden/Pasifik :

object(DateTimeImmutable)#2 (3) { 
    ["date"]=> 
    string(26) "2016-09-01 00:00:00.000000" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(10) "US/Pacific" 
} 
object(DateTimeImmutable)#4 (3) { 
    ["date"]=> 
    string(26) "2016-10-01 00:00:00.000000" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(10) "US/Pacific" 
} 
int(1) 
int(0) 
+0

Eğer 'var_dump'ing saat, dakika, saniye ve milisaniye de sakıncası var mı? – Mchl

+0

Bu, PHP'nin kendisinde bir hata olabilir mi? –

+0

@MichaelHirschler belki emin değilim, bu yüzden sorumu bu yüzden gönderdim – patie

cevap

1

Bu gerçekten PHP DateTime sınıfında küçük bir hatadır. Sen UTC dilimini kullanmak ve hesaplama sonrasında istenilen saat dilimi ayarlayın gerekir:

date_default_timezone_set('UTC'); 

$europePrag = new DateTimeZone('Europe/Prague'); 
$usPacific = new DateTimeZone('US/Pacific'); 

$from = new \DateTimeImmutable('2016-11-01'); 
$to = $from->add(new \DateInterval('P1M')); 
$from->setTimezone($europePrag); 
var_dump($from); 
var_dump($to); 
var_dump($from->diff($to)->m); 
var_dump($from->diff($to)->d); 


$from = new \DateTimeImmutable('2016-11-01'); 
$to = $from->add(new \DateInterval('P1M')); 
$from->setTimezone($usPacific); 
var_dump($from); 
var_dump($to); 
var_dump($from->diff($to)->m); 
var_dump($from->diff($to)->d);