PHP时间戳记到DateTime中

你知道我可以如何将其转换为strtotime或类似的值types传递到DateTime对象?

我有这个date:

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

我试过了:

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

以上是不正确的。 如果我循环了很多不同的date,那么所有的date。

您不需要将string转换为时间戳来创buildDateTime对象(事实上,它的构造函数甚至不允许您这样做,正如您所知道的)。 您可以简单地将您的datestring按原样提供给DateTime构造函数:

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

这就是说,如果你有一个时间戳,而不是一个string,你可以这样做使用DateTime::setTimestamp()

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

编辑(2014-05-07):

我当时并没有意识到这一点,但DateTime构造函数确实支持直接从时间戳创build实例。 根据这个文档 ,所有你需要做的是在@字符前加上时间戳:

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

虽然@drrcknlsn是正确的断言有多种方法将时间string转换为数据时间,重要的是要认识到,这些不同的方式不以相同的方式处理时区。


选项1: DateTime('@' . $timestamp)

考虑下面的代码:

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

strtotime位消除时区信息,并且date_create函数假定GMT( Europe/Brussels )。

因此,输出将如下所示,不pipe我运行在哪个服务器上:

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

选项2: date_create()->setTimestamp($timestamp)

考虑下面的代码:

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

你可能期望这产生相同的输出。 但是,如果我从比利时服务器执行此代码,我得到以下输出:

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

date_create函数不同, setTimestamp方法假定服务器的时区(在我的情况下是'Europe/Brussels' )而不是GMT。


明确设置你的时区

如果您想确保您的输出与您的input的时区相匹配,最好明确地设置它。

考虑下面的代码:

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

现在,也考虑下面的代码:

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

因为我们显式设置输出的时区以匹配input的时区,所以两者都会创build相同的(正确的)输出:

 2011-12-12T21:17:52+08:00 

可能最简单的解决scheme是:

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

U表示Unix时代。 看文档: http : //php.net/manual/en/datetime.createfromformat.php