2012-02-04 8 views
11

Nie jestem ekspertem od php. Wiem, że strefy czasowe są supported w PHP.Jak odzyskać przesunięcie strefy czasowej z GMT + 0 w php?

Dla danej strefy czasowej TZ obsługiwanej przez PHP, muszę pobrać przesunięcie (tj. Liczbę godzin i minut do dodania lub odjęcia) do znanego UTC (tj. GMT + 0), aby uzyskać ten czas w strefie TZ .

Jak mogę to osiągnąć? Ostatecznie, potrzebuję uzyskać te przesunięcia dla wszystkich obsługiwanych stref czasowych w PHP. Dzięki.

+0

Nie możesz po prostu ustawić domyślnej strefy czasowej na to, czego potrzebujesz? – Jivings

+0

Potrzebuję operacji odwrotnej. – JVerstry

+0

Zobacz moją odpowiedź w jednym wierszu ** [poniżej] (http://stackoverflow.com/a/40204648/4134066) **. – MNR

Odpowiedz

18

Jest to prosty przykład, jak uzyskać strefy czasowej w sekundach:

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

aby go wyświetlić w formacie GMT + x:

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

working example

+0

@Raceimaztion ** nie zatwierdza nieprawidłowych zmian **. Przeglądanie jest poważną odpowiedzialnością i wymaga uważnej uwagi, zatwierdzono 101 edycji, które nie są wiarygodne. –

+1

Należy pamiętać, że faktyczny format odpowiedzi jest nieprawidłowy: W odpowiedzi podano, że przesunięcie używa standardu GMT, a zamiast tego używa standardu UTC. GMT (Greenwich Mean Time) ma wpływ na czas letni, co oznacza, że ​​latem GMT przejdzie z UTC + 0 do UTC + 1. Na przykład kraj taki jak Włochy, który ma GMT + 1 lub UTC + 1 otrzyma czas UTC + 2 w lecie. Testowanie tego kodu z "Europe/Rome" zwróciło "GMT + 2", co jest nieprawidłowe, ten kod zamiast tego zwraca wartość UTC –

+0

@Teneff, czy mógłbyś napisać jedną linijkę? W niektórych przypadkach może być bardziej przydatny ... :) –

2

Dla wszystkich obsługiwanych stref czasowych w 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

To będzie Ci standard offsetu (nie jeden w lub z DST [w zależności od pory roku]):

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

Zastosowanie:

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

Można spójrz na różnice here.

+0

Świetna odpowiedź.W tym kodzie na linii foreach jest literówka - dodatkowy nawias zamykający. –

+1

Właściwie ta odpowiedź jest dość problematyczna: pobieranie wszystkich przejść jest bardzo powolne, zabierając dużo pamięci. Jeśli robisz to przez więcej niż jedną strefę czasową, to prawdopodobnie zły pomysł. Lepsza implementacja może przynieść tylko przejścia z zeszłego roku - zobacz komentarze na http://www.php.net/manual/en/datetimezone.gettransitions.php, które mają sens (jest to funkcja PHP 5.3 AIUI). –

+0

@GeorgeLund: Tak, napisałem to w wersji 5.2, nie wahaj się zaktualizować. :-) –

15

ten będzie przydatny do konwersji wartości przesunięcia w formacie GMT bez kalkulacji

<?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

proste za pomocą wbudowanego api. Słodkie! –

+0

To jest NAJLEPSZA odpowiedź! –

3

Jest to możliwe tylko przez następujący jednej linii.

echo (new DateTime('now', new DateTimeZone('Asia/Kabul')))->format('P'); 
Powiązane problemy