2013-03-25 9 views
36

Próbuję przekonwertować czas między bieżącym czasem na UTC i UTC na bieżącą strefę czasową.Jak przekonwertować między strefami czasowymi w PHP przy użyciu klasy DateTime?

Oto co zrobiłem:

$schedule_date = new DateTime($triggerOn, new DateTimeZone('UTC')); 
$triggerOn = $schedule_date->format('Y-m-d H:i:s'); 

echo $triggerOn; 

wartość Wyjście nie zmienia, że ​​jedyną rzeczą, która zmienia się w pliku PDF.

ciąg $triggerOn została wygenerowana na podstawie America/Los_Angeles czasowej

ten sposób mój ciąg wygląda przed i po:

BEFORE 04/01/2013 03:08 PM 
AFTER  2013-04-01 15:08:00 

Więc problem jest to, że nie konwertuje DateTime do UTC.

+1

Co oznacza '$ triggerOn' zawierać zanim przejdzie on do' new DateTime() '? –

+0

Konstruktor DateTime() oczekuje, że pierwszym argumentem będzie czas. Może twój $ triggerOn nie jest odpowiednią wartością czasu. – mavili

+0

$ triggerOn wartość id 04/01/2013 03:08 PM – Jaylen

Odpowiedz

76

Co szukasz to:

$triggerOn = '04/01/2013 03:08 PM'; 
$user_tz = 'America/Los_Angeles'; 

echo $triggerOn; // echoes 04/01/2013 03:08 PM 

$schedule_date = new DateTime($triggerOn, new DateTimeZone($user_tz)); 
$schedule_date->setTimeZone(new DateTimeZone('UTC')); 
$triggerOn = $schedule_date->format('Y-m-d H:i:s'); 

echo $triggerOn; // echoes 2013-04-01 22:08:00 
+0

Dziękuję bardzo za to właśnie tego szukałem. Dziękuję :) – Jaylen

+0

tylko fyi dla czytelników: 'setTimeZone' zmienia ciąg strefy czasowej obiektu, jak również wartość datetime. format jest po prostu tym, co jest używane do uzyskania ciągu znaków. To nie jest tak, że 'setTimeZone' zmienia tylko właściwość strefy czasowej, a następnie format wypluwa ją tylko - rzeczywista liczbowa wartość czasu uległa zmianie po wykonaniu' setTimeZone'. – ahnbizcad

+0

@ahnbizcad 04/01/2013 03:08 PM w Los Angeles dokładnie w tym samym czasie co 2013-04-01 22:08:00 w UTC. Sam czas się nie zmienia, tylko strefa czasowa. – Mike

2

Utwórz datę przy użyciu lokalnej strefy czasowej, a następnie zadzwoń pod numer DateTime::setTimeZone(), aby ją zmienić.

+0

Jak mogę usersetTimezone go zmienić: $ triggerOn jest tworzony przez czas lokalny i chcę go przekonwertować na UTC. – Jaylen

+1

Nie wiem, dlaczego to stwierdzenie, biorąc pod uwagę odpowiedź oznaczoną jako poprawna, robi dokładnie to. Brakowało szczegółów, przyznaję, to jest dość proste pytanie. – Jerry

13

spożywają datę/godzinę i ustawienie strefy czasowej poprawnie, jednak przed formatowaniem datetime, nie ustawiasz żądaną strefę czasową wyjściowego. Oto przykład, który akceptuje Strefa czasowa UTC i konwertuje datę/czas, aby Ameryka/Los_Angeles strefa czasu:

<?php 
$original_datetime = '04/01/2013 03:08 PM'; 
$original_timezone = new DateTimeZone('UTC'); 

// Instantiate the DateTime object, setting it's date, time and time zone. 
$datetime = new DateTime($original_datetime, $original_timezone); 

// Set the DateTime object's time zone to convert the time appropriately. 
$target_timezone = new DateTimeZone('America/Los_Angeles'); 
$datetime->setTimeZone($target_timezone); 

// Outputs a date/time string based on the time zone you've set on the object. 
$triggerOn = $datetime->format('Y-m-d H:i:s'); 

// Print the date/time string. 
print $triggerOn; // 2013-04-01 08:08:00 
+1

Dziękujemy za ten przykład, ponieważ wyjaśnia to rozwiązanie jeszcze bardziej :) – Jaylen

Powiązane problemy