2012-02-04 31 views
11

Tôi không có chuyên gia về php. Tôi biết múi giờ là supported trong PHP.Làm thế nào để lấy bù đắp múi giờ từ GMT + 0 trong php?

Đối với một múi giờ nhất định TZ được PHP hỗ trợ, tôi cần truy xuất bù đắp (tức là số giờ và phút để thêm hoặc trừ) vào UTC đã biết (tức là GMT + 0) để nhận thời gian đó trong vùng TZ .

Tôi làm cách nào để đạt được điều này? Cuối cùng, tôi cần phải có được những bù đắp đó cho tất cả các múi giờ được hỗ trợ trong PHP. Cảm ơn.

+0

Bạn không thể đặt múi giờ mặc định thành những gì bạn cần? – Jivings

+0

Tôi cần hoạt động ngược lại. – JVerstry

+0

Xem câu trả lời của dòng đơn của tôi ** [bên dưới] (http://stackoverflow.com/a/40204648/4134066) **. – MNR

Trả lời

18

Đây là một ví dụ đơn giản như thế nào để có được múi giờ bù đắp trong vài giây:

$dtz = new DateTimeZone('Europe/Sofia'); 
$time_in_sofia = new DateTime('now', $dtz); 
echo $dtz->getOffset($time_in_sofia); 

để hiển thị nó trong định dạng GMT + x:

$offset = $dtz->getOffset($time_in_sofia)/3600; 
echo "GMT" . ($offset < 0 ? $offset : "+".$offset); 

working example

+0

@Raceimaztion ** không phê duyệt các chỉnh sửa không hợp lệ **. Việc đánh giá là trách nhiệm nghiêm trọng và yêu cầu bạn chú ý cẩn thận, bạn đã phê duyệt 101 chỉnh sửa theo thứ tự không đáng tin cậy. –

+1

Xin lưu ý rằng định dạng câu trả lời thực tế là sai: Câu trả lời nói rằng bù đắp sử dụng tiêu chuẩn GMT, trong khi thay vào đó nó sử dụng tiêu chuẩn UTC. GMT (Giờ chuẩn Greenwich) bị ảnh hưởng vào mùa hè, nghĩa là vào mùa hè, GMT sẽ chuyển từ UTC + 0 sang UTC + 1. Ví dụ: , một quốc gia như Ý, có GMT + 1 hoặc UTC + 1 sẽ nhận được UTC + 2 vào mùa hè. Kiểm tra mã này với 'Châu Âu/Rome' trả về "GMT + 2" không đúng, mã này thay vào đó trả về giá trị UTC –

+0

@Teneff, Bạn có thể viết một lớp lót không? Nó có thể tiện dụng hơn trong một số trường hợp ... :) –

2

Đối với tất cả các múi giờ được hỗ trợ bằng PHP:

$timezone_offsets = array(); 

foreach(timezone_identifiers_list() as $timezone_identifier) 
{ 
    $date_time_zone = new DateTimeZone($timezone_identifier); 
    $date_time = new DateTime('now', $date_time_zone); 
    $timezone_offsets[$timezone_identifier] = $date_time_zone->getOffset($date_time); 
} 

print_r($timezone_offsets); 
14

Điều này sẽ giúp bạn có được tiêu chuẩn bù đắp (không phải là người trong hoặc ra khỏi DST [tùy thuộc vào thời điểm trong năm]):

function getStandardOffsetUTC($timezone) 
{ 
    if($timezone == 'UTC') { 
     return ''; 
    } else { 
     $timezone = new DateTimeZone($timezone); 
     $transitions = array_slice($timezone->getTransitions(), -3, null, true); 

     foreach (array_reverse($transitions, true) as $transition) 
     { 
      if ($transition['isdst'] == 1) 
      { 
       continue; 
      } 

      return sprintf('UTC %+03d:%02u', $transition['offset']/3600, abs($transition['offset']) % 3600/60); 
     } 

     return false; 
    } 
} 

Cách sử dụng:

echo getStandardOffsetUTC('Europe/Sofia'); // UTC +02:00 

Bạn có thể xem nhanh sự khác biệt here.

+0

Câu trả lời hay.Có lỗi đánh máy trong mã này trên dòng foreach - một khung đóng bổ sung. –

+1

Thực ra câu trả lời này khá là có vấn đề: tìm nạp tất cả các hiệu ứng chuyển tiếp rất chậm, chiếm nhiều bộ nhớ. Nếu bạn làm điều này nhiều hơn một múi giờ, thì đó có thể là một ý tưởng tồi. Triển khai tốt hơn có thể chỉ tìm nạp chuyển tiếp cho năm ngoái - xem các nhận xét trên http://www.php.net/manual/en/datetimezone.gettransitions.php mà một khi thực sự có ý nghĩa (đây là tính năng PHP 5.3 AIUI). –

+0

@GeorgeLund: Vâng, tôi đã viết điều này cho 5.2 vào thời điểm đó, vui lòng cập nhật nó. :-) –

15

này sẽ hữu ích để chuyển đổi các giá trị bù đắp sang định dạng giờ mà không cần bất kỳ tính

<?php 

    //target time zone 
    $target_time_zone = new DateTimeZone('America/Los_Angeles'); 

    //find kolkata time 
    $date_time = new DateTime('now', $target_time_zone); 

    //get the exact GMT format 
    echo 'GMT '.$date_time->format('P'); 
+0

đơn giản bằng cách sử dụng api sẵn có. ngọt! –

+0

Đây là câu trả lời TỐT NHẤT! –

3

Có thể chỉ bằng những dòng sau đây.

echo (new DateTime('now', new DateTimeZone('Asia/Kabul')))->format('P'); 
Các vấn đề liên quan