2013-05-25 20 views
10

Mam uniksowy znacznik czasu, który jest ustawiony na +5, ale chciałbym przekonwertować go na -5, EST Standardowy czas. Po prostu generowałbym znacznik czasu w tej strefie czasowej, ale chwytam go z innego źródła, które umieszcza na +5.Konwersja znacznika czasu Unix do strefy czasowej?

Aktualny niemodyfikowane Datownik przekształcana randkę

<? echo gmdate("F j, Y, g:i a", 1369490592) ?> 

Odpowiedz

30

Korzystanie DateTime i DateTimeZone:

$dt = new DateTime('@1369490592'); 
$dt->setTimeZone(new DateTimeZone('America/Chicago')); 
echo $dt->format('F j, Y, g:i a'); 

See it in action

+3

Pracował idealnie. Dzięki =) –

+0

Popraw mnie jeśli się mylę @John Z pewnością to nie działa? Ta metoda użyje domyślnej strefy czasowej systemów (PHP Config), która nie określiła jej podczas tworzenia instancji obiektu DateTime. Podobnie jak [tutaj] (http://stackoverflow.com/a/17098897/234631). Czy więc podczas konwersji do Ameryki/Chicago zmiana zostanie zmieniona na strefę czasową systemu, zakładając, że nie jest to taki sam jak +5, jak sam znacznik czasu UNIX, który próbuje zmienić o ~ 10 stref? –

+1

@Stefan Rzeczywiście jest źle. Uniksowe znaczniki czasu to zawsze UTC. Niektóre zabawne próbki kodu: ini_set ("date.timezone", "America/Los_Angeles"); $ now = time(); $ utc = new DateTime ("@ {$ now}}", nowy DateTimeZone ("America/New_York")); echo "{$ utc-> format (" c ')} \ n "; // 2014-08-27T15: 24: 09 + 00: 00 $ utc = new DateTime ("@ {$ now}"); echo "{$ utc-> format (" c ')} \ n "; // 2014-08-27T15: 24: 09 + 00: 00 ini_set ("date.timezone", "UTC"); $ utc = new DateTime ("@ {$ now}}", nowy DateTimeZone ("UTC")); echo "{$ utc-> format (" c ')} \ n "; // 2014-08-27T15: 24: 09 + 00: 00 –

0

Jako ponieważ edycji kolejce do John Conde's answer jest pełna dodam bardziej szczegółowy odpowiedź.

Od DateTime::__construct(string $time, DateTimeZone $timezone)

Parametr $ stref czasowych i obecny czasowej są ignorowane gdy $ parametr czas albo jest datownika UNIX (np @ 946684800) ...

To Głównym powodem, dla którego powinieneś zawsze określać strefę czasową, nawet domyślną, podczas tworzenia obiektów DateTime ze znacznika czasu unix. Zobacz wyjaśnił kod inspirowany John Conde's answer:

$dt = new DateTime('@1369490592'); 

// use your default timezone to work correctly with unix timestamps 
// and in line with other parts of your application 
date_default_timezone_set ('America/Chicago'); // somewhere on bootstrapping time 
… 
$dt->setTimeZone(new DateTimeZone(date_default_timezone_get())); 

// set timezone to convert time to the other timezone 
$dt->setTimeZone(new DateTimeZone('America/Chicago')); 

echo $dt->format('F j, Y, g:i a'); 
0

łatwiej sposobem na to jest:

Podczas korzystania gmdate() dodaj swoją strefę czasową w sekundach unix_stamp w gmdate.

Weź pod uwagę moją strefę czasową to GMT + 5: 30. Więc 5 h 30 min w sekundach będzie

tak, ja to zrobić:

gmdate("F j, Y, g:i a", 1369490592+19800)

Powiązane problemy