2014-09-04 15 views
5

Khi sử dụng các lớp PHP DateTime và cố gắng thiết lập một DateTimeZone tôi nhận được kết quả khác nhau tùy thuộc vào cách tôi đặt nó: sử dụng DateTime::__construct hoặc sử dụng phương pháp DateTime::setTimezone.PHP DateTime múi giờ - Constructor vs phương pháp Setter

đây là một ví dụ:

$date = '2014-08-01' 

$dateTimeOne = new DateTime($date, new DateTimeZone('America/Los_Angeles')); 
echo $dateTimeOne->format('Y-m-d\TH:i:sP'); 
// 2014-08-01T00:00:00-07:00 

$dateTimeTwo = new DateTime($date); 
$dateTimeTwo->setTimezone(new DateTimeZone('America/Los_Angeles')); 
echo $dateTimeTwo->format('Y-m-d\TH:i:sP'); 
// 2014-07-31T17:00:00-07:00 

Xem thêm http://3v4l.org/LrZfM

Tôi đã nhìn quanh và đã không tìm thấy một lời giải thích thỏa đáng nhằm giải quyết những hành vi đặc thù khác so với những nhận xét sau đây trong php docs: datetime.settimezone và cuốn sách php|architect's Guide to Date and Time Programming: Dealing with Timezones - DateTimeZone.

Nhận xét nói rằng phương thức DateTime::setTimezone sẽ thay đổi múi giờ cho một điểm cụ thể trong thời gian (dấu thời gian) nhưng dấu thời gian Unix vẫn không thay đổi.

Mặt khác, tham số DateTime::__construct DateTimeZone được sử dụng để "ghi đè múi giờ mặc định hiện tại bằng múi giờ do người dùng xác định" Chapter 3: Dealing with Timezones - DateTimeZone.

Khác với những điều này không có nhiều về chủ đề (mà tôi đã có thể tìm thấy).

Đây là những gì tôi muốn biết:

  • giải thích sâu hơn về hai cách sau đây để thiết lập múi giờ
  • Khi nào tôi nên sử dụng DateTime::__construct để thiết lập múi giờ
  • Khi nào tôi nên sử dụng DateTime::setTimezone để đặt múi giờ
  • Ví dụ rõ ràng về cách sử dụng cái này so với cách khác hoặc cách sử dụng chúng một cách kết hợp
+2

Có múi giờ trong hàm tạo có nghĩa là '$ date' nằm trong múi giờ đó; đặt múi giờ sẽ di chuyển ngày theo sự khác biệt giữa múi giờ lúc xây dựng và múi giờ nhất định. –

Trả lời

1

Đây là hành vi bình thường.

Khi bạn không chỉ định múi giờ trong hàm tạo, múi giờ mặc định được sử dụng, tức là những gì được đặt bằng date_default_timezone_set().

Khi bạn sau đó gọi:

$dateTimeTwo->setTimezone(new DateTimeZone('America/Los_Angeles')); 

Nó di chuyển ngày thiết lập trong múi giờ mặc định vào múi giờ mới.


1) (constructor) thiết lập ngày trong
2) (setter 'Mỹ/Los_Angeles') thiết lập ngày trong múi giờ mặc định, ngày chuyển sang


mặc định của bạn 'Mỹ/Los_Angeles' múi giờ có lẽ là UTC hoặc một cái gì đó gần gũi. Bạn đã nói với máy tính để thiết lập 2014-08-01 tại UTC. Sau đó, bạn được yêu cầu chuyển sang múi giờ 'America/Los_Angeles' sớm hơn 7 giờ, bằng cách thay đổi ngày thành 2014-07-31 lúc 17:00.

Các vấn đề liên quan