2009-09-18 43 views
5

Có rất nhiều thông tin về điều chỉnh múi giờ trong PHP, nhưng tôi chưa tìm thấy câu trả lời cho cụ thể những gì tôi muốn làm do tất cả các nhiễu.Điều chỉnh múi giờ trong PHP với DateTime/DateTimeZone

Cho một thời gian trong một múi giờ, tôi muốn chuyển đổi nó thành thời gian trong một múi giờ khác.

This về cơ bản là những gì tôi muốn thực hiện, nhưng tôi cần có khả năng thực hiện việc này bằng cách chỉ sử dụng các PHP dựng sẵn trong PHP, chứ không phải PEAR Date.

Đây là những gì tôi đã làm, nhưng nó dường như luôn luôn cho tôi tương đối bù đắp lấy múi giờ GMT:

$los_angeles_time_zone = new DateTimeZone('America/Los_Angeles'); 
$hawaii_time_zone = new DateTimeZone('Pacific/Honolulu'); 

$date_time_los_angeles = new DateTime('2009-09-18 05:00:00', $los_angeles_time_zone); 
printf("LA Time: %s<br/>", $date_time_los_angeles->format(DATE_ATOM)); 

$time_offset = $hawaii_time_zone->getOffset($date_time_los_angeles); 
printf("Offset: %s<br/>", $time_offset); 

Đây là kết quả:

LA Thời gian: 2009-09 -18T05: 00: 00-07: 00
Bù đắp: -36000

Tôi đã mong đợi 3 giờ (10800 giây). nhưng điều '-7: 00' nói với tôi rằng nó giữ mọi thứ liên quan đến GMT, điều này có thể giải thích tại sao nó cho tôi sự bù đắp "tuyệt đối".

Làm thế nào để tôi chỉ nhận được chênh lệch giữa hai múi giờ mà không có tất cả hoohah GMT này?

Cảm ơn.

UPDATE:

tôi đã xảy ra với tôi rằng tôi có thể làm được điều này và nhận được những gì tôi muốn:

$date_time_los_angeles = new DateTime('2009-09-18 05:00:00', $los_angeles_time_zone); 
printf("LA Time: %s<br/>", $date_time_los_angeles->format(DATE_ATOM)); 

$date_time_hawaii = new DateTime('2009-09-18 05:00:00', $hawaii_time_zone); 
printf("Hawaii Time: %s<br/>", $date_time_hawaii->format(DATE_ATOM)); 


$time_offset = $los_angeles_time_zone->getOffset($date_time_los_angeles) - $hawaii_time_zone->getOffset($date_time_los_angeles); 
printf("Offset: %s<br/>", $time_offset); 

Nhưng nó cảm thấy lúng túng với tôi. Bất cứ ai biết một cách sạch hơn để làm điều đó?

Trả lời

8

Dưới đây là một vài hàm sử dụng các lớp DateTime. Việc đầu tiên sẽ trả về sự khác biệt trong vài giây giữa hai múi giờ. Thứ hai trả về một "bản dịch" của thời gian từ một múi giờ này sang múi giờ khác.

function timezone_diff($tz_from, $tz_to, $time_str = 'now') 
{ 
    $dt = new DateTime($time_str, new DateTimeZone($tz_from)); 
    $offset_from = $dt->getOffset(); 
    $timestamp = $dt->getTimestamp(); 
    $offset_to = $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->getOffset(); 
    return $offset_to - $offset_from; 
} 

function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s') 
{ 
    $dt = new DateTime($time_str, new DateTimezone($tz_from)); 
    $timestamp = $dt->getTimestamp(); 
    return $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->format($format); 
} 

Demo:

$los_angeles_time = '2009-09-18 05:00:00'; 
$los_angeles_tz = 'America/Los_Angeles'; 
$hawaii_tz  = 'Pacific/Honolulu'; 

$los_angeles_hawaii_diff = timezone_diff($los_angeles_tz, $hawaii_tz, $los_angeles_time); 
echo $los_angeles_hawaii_diff . '<br />'; 

$hawaii_time = time_translate($los_angeles_tz, $hawaii_tz, $los_angeles_time); 
echo $hawaii_time . '<br />'; 
+0

Ngẫu nhiên :), đây là dành cho PHP> = 5.3.0. – GZipp

+0

Chúng dường như không tính đến DST. Tôi sử dụng các chức năng trên để biến CST thành GMT và tất cả thời gian của tôi đã hết 1 giờ. –

0

Chỉ cần trừ đi lần đầu tiên từ giây thứ hai.

Bạn sẽ có thể nhận được sự khác biệt về thời gian trong vài giây.

1

Như GZipp nhận xét, mã của ông thực sự chỉ dành cho PHP> = 5.3.0. Đó là tốt, nhưng - đây là một phiên bản mà sẽ làm việc trong PHP> = 5.2.0. (Ngẫu nhiên, nó cũng hoạt động trong 5.3+ và với 2 cuộc gọi ít chức năng hơn)

<?php 
function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s') 
{ 
    $dt = new DateTime($time_str, new DateTimezone($tz_from)); 
    $dt->setTimezone(new DateTimezone($tz_to)); 
    return $dt->format($format); 
} 

$time_diffs = array('now', '-1 hour', '-1 day', '-1 week', '-1 month', '+1 hour', '+1 week', '+1 month'); 

foreach ($time_diffs as $diff) 
{ 
echo "{$diff}:" 
    . "\n\t" 
    . "Current: " . date("Y-m-d H:i:s", strtotime($diff)) 
    . "\n\t" 
    . "UTC: " . time_translate("US/Eastern", "UTC", $diff) 
    . "\n\n"; 
} 
+0

Cảm ơn bạn rất nhiều, nó làm việc với phiên bản php 5.2. Nhưng nếu tôi muốn đi với phút và thứ hai khác thì những thông số của tôi là gì. Có nghĩa là trong mảng thời gian khác nhau. – user3305818

+0

tham số '$ diff' (' $ time_str') chỉ đơn giản là một chuỗi mà 'strtotime' hiểu, sẽ trả về dấu thời gian unix thích hợp. Vì vậy, chỉ cần vượt qua '-1 -1 phút hoặc''' '-1 giây'' hoặc bất kỳ khoảng thời gian nào bạn muốn.Mục đích của câu hỏi/câu trả lời này không phải là để tính toán sự khác biệt về thời gian hoặc giải thích cách sử dụng ['strtotime'] (http://php.net/strtotime), để chuyển đổi thời gian trong một múi giờ thành giờ địa phương trong múi giờ khác. –

+0

Tác phẩm của nó. Nhưng bây giờ nếu tôi muốn cung cấp tất cả các thông số như, 1 ngày, 3 giờ, 10 phút và 20 giây trước đó. Xin vui lòng cho tôi biết. – user3305818

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