将 PHP 时间戳转换为日期时间

你知道我如何将它转换成 strtotime 或者类似的值传递到 日期时间对象中吗?

我的日期:

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

以上内容是不正确的。如果我循环了很多不同的日期,它们都是相同的日期。

130621 次浏览

You don't need to turn the string into a timestamp in order to create the DateTime object (in fact, its constructor doesn't even allow you to do this, as you can tell). You can simply feed your date string into the DateTime constructor as-is:

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

也就是说,如果您确实希望使用一个时间戳来代替字符串,那么可以使用 DateTime::setTimestamp():

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

Edit (2014-05-07):

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

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

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


Option 1 : DateTime('@' . $timestamp)

考虑以下代码:

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

The strtotime bit eliminates the time zone information, and the date_create function assumes GMT.

因此,无论我在哪个服务器上运行它,输出都是如下:

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

You might expect this to produce the same output. However, if I execute this code from a Belgian server, I get the following output :

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

date_create函数不同,setTimestamp方法假定服务器的时区(在我的例子中是 CET)而不是 GMT。


明确设置时区

如果希望确保输出与输入的时区相匹配,最好显式地设置它。

考虑以下代码:

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

因为我们显式地将输出的时区设置为与输入的时区匹配,所以两者都将创建相同的(正确的)输出:

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

也许最简单的解决办法就是:

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

其中“ U”代表 Unix 时代。参见文档: http://php.net/manual/en/datetime.createfromformat.php

这是我的解决办法:

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