2016-09-05 30 views
13

Tôi gặp vấn đề với PHP DateDiff, tôi không hiểu tại sao mỗi múi giờ trả về các kết quả khác nhau, ví dụ trong trường hợp này là Prague trả về 0 tháng và US trở về 1 tháng.DateDiff trả về kết quả khác nhau cho mỗi múi giờ

Sự khác biệt này và cách tôi trả lại 1 tháng (thay vì 30 ngày, khi tôi thêm 1 tháng) như mong đợi?

đang Châu Âu/Prague:

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); 

kết quả Châu Âu/Prague:

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) 

-

đang Mỹ/Thái Bình Dương:

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); 

dẫn Mỹ/Thái Bình Dương :

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

Bạn có nhớ 'var_dump'ing giờ, phút, giây và mili giây là tốt? – Mchl

+0

Đây có phải là lỗi trong chính PHP không? –

+0

@MichaelHirschler có thể, tôi không chắc chắn, đây là lý do tại sao tôi đăng câu hỏi của mình lên SO – patie

Trả lời

1

Đây thực sự là lỗi nhỏ trong lớp DateTime của PHP. Bạn phải sử dụng UTC múi giờ và thiết lập múi giờ mong muốn sau khi tính toán:

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); 
Các vấn đề liên quan