Chociaż @drrcknlsn ma rację, twierdząc, że istnieje wiele sposobów konwersji ciągu czasu na datę i godzinę, ważne jest, aby zdać sobie sprawę, że te różne sposoby nie dotyczą stref czasowych w ten sam sposób.
Opcja 1 : DateTime('@' . $timestamp)
Rozważ następujący kod:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
strtotime
Nieco eliminuje strefy czasowej, a date_create
funkcja przyjmuje GMT ( Europe/Brussels
).
W związku z tym wynik będzie następujący, bez względu na to, na którym serwerze go uruchomię:
2011-12-12T13:17:52+00:00
Opcja 2 : date_create()->setTimestamp($timestamp)
Rozważ następujący kod:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
Można się spodziewać, że da to taki sam wynik. Jeśli jednak wykonam ten kod z serwera belgijskiego, otrzymam następujący wynik:
2011-12-12T14:17:52+01:00
W przeciwieństwie do date_create
funkcji setTimestamp
metoda zakłada strefę czasową serwera ( 'Europe/Brussels'
w moim przypadku) zamiast GMT.
Jawne ustawienie strefy czasowej
Jeśli chcesz mieć pewność, że dane wyjściowe odpowiadają strefie czasowej danych wejściowych, najlepiej ustawić to jawnie.
Rozważ następujący kod:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
Teraz rozważ również następujący kod:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
Ponieważ jawnie ustawiliśmy strefę czasową danych wyjściowych tak, aby pasowały do strefy wejściowej, obie utworzą takie same (poprawne) dane wyjściowe:
2011-12-12T21:17:52+08:00