Czy wiesz, jak mogę przekonwertować to na strtotime lub podobny typ wartości, aby przejść do obiektu DateTime ?
Data, którą mam:
Mon, 12 Dec 2011 21:17:52 +0000
Co próbowałem:
$time = substr($item->pubDate, -14);
$date = substr($item->pubDate, 0, strlen($time));
$dtm = new DateTime(strtotime($time));
$dtm->setTimezone(new DateTimeZone(ADMIN_TIMEZONE));
$date = $dtm->format('D, M dS');
$time = $dtm->format('g:i a');
Powyższe nie jest poprawne. Jeśli przeglądam wiele różnych dat, wszystkie są tej samej daty.
źródło
new DateTime('@' . $timestamp)
i$dt = new DateTime(); $dt->setTimestamp($timestamp)
nie zajmuj się strefami czasowymi w ten sam sposób. Zobacz moją odpowiedź @ stackoverflow.com/questions/12038558/ ..., aby uzyskać więcej informacji.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, adate_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
funkcjisetTimestamp
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
źródło
Prawdopodobnie najprostsze rozwiązanie to po prostu:
DateTime::createFromFormat('U', $timeStamp);
Gdzie „U” oznacza epokę Uniksa. Zobacz dokumentację: http://php.net/manual/en/datetime.createfromformat.php
źródło
->setTimezone
aby ustawić preferowaną strefę czasową, zanim zadzwonisz->format()
to jest moje rozwiązanie:
function changeDateTimezone($date, $from='UTC', $to='Asia/Tehran', $targetFormat="Y-m-d H:i:s") { $date = new DateTime($date, new DateTimeZone($from)); $date->setTimeZone(new DateTimeZone($to)); return $date->format($targetFormat); }
źródło