it-swarm.dev

PHP Časové razítko do DateTime

Víte, jak to můžu převést na strtotime, nebo podobný typ hodnoty, který má být předán do objektu DateTime object?

Datum, kdy mám:

Mon, 12 Dec 2011 21:17:52 +0000

Co jsem se snažil:

$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');

Výše uvedené není správné. Pokud jsem smyčka přes mnoho různých dat jeho všechny stejné datum.

61
JREAM

Pro vytvoření objektu DateTime nemusíte řetězec přeměnit na časové razítko (ve skutečnosti jeho konstruktor vám to ani neumožňuje, jak můžete říci). Datový řetězec můžete jednoduše vkládat do konstruktoru DateTime jako je:

// Assuming $item->pubDate is "Mon, 12 Dec 2011 21:17:52 +0000"
$dt = new DateTime($item->pubDate);

Pokud však máte časovou značku, kterou chcete použít místo řetězce, můžete tak učinit pomocí DateTime::setTimestamp() :

$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime();
$dt->setTimestamp($timestamp);

Upravit (2014-05-07):

V té době jsem o tom vlastně ani nevěděl, ale DateTime konstruktor does podporuje vytváření instancí přímo z časových razítek. Podle této dokumentace vše, co musíte udělat, je předepsat časové razítko znakem @:

$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime('@' . $timestamp);
111
FtDRbwLXw6

Zatímco @drrcknlsn je správné tvrdit, že existuje více způsobů, jak převést časový řetězec na datový čas, je důležité si uvědomit, že tyto různé způsoby se s časovými zónami nezabývají stejným způsobem.


Možnost 1: DateTime('@' . $timestamp)

Zvažte následující kód:

date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');

Bit strtotime odstraňuje informace o časové zóně a funkce date_create předpokládá GMT (Europe/Brussels).

Jako takový bude výstup následující, bez ohledu na to, na kterém serveru je spuštěn:

2011-12-12T13:17:52+00:00

Možnost 2: date_create()->setTimestamp($timestamp)

Zvažte následující kód:

date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');

Můžete očekávat, že bude produkovat stejný výstup. Pokud však tento kód provedu z belgického serveru, dostanu následující výstup:

2011-12-12T14:17:52+01:00

Na rozdíl od funkce date_create metoda setTimestamp předpokládá spíše časové pásmo serveru (v mém případě 'Europe/Brussels') než GMT.


Explicitní nastavení časové zóny

Pokud se chcete ujistit, že výstup odpovídá časovému pásmu vašeho vstupu, je nejlepší jej nastavit explicitně.

Zvažte následující kód:

date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')

Zvažte také následující kód:

date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')

Protože jsme explicitně nastavili časové pásmo výstupu tak, aby odpovídalo vstupu, oba vytvoří stejný (správný) výstup:

2011-12-12T21:17:52+08:00
22
John Slegers

Nejjednodušším řešením je pravděpodobně:

DateTime::createFromFormat('U', $timeStamp);

Kde 'U' znamená Unixovou epochu. Viz dokumenty: http://php.net/manual/en/datetime.createfromformat.php

12
forsberg

je to moje řešení:

    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);
    }
0
ingenious