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

2022-08-30 07:19:47

你知道我怎么能把它转换为 strtotime 或类似类型的值以传递到 DateTime 对象中吗?

我有的日期:

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

以上是不正确的。如果我循环浏览许多不同的日期,它都是相同的日期。


答案 1

您不需要将字符串转换为时间戳即可创建对象(实际上,它的构造函数甚至不允许您执行此操作,正如您所知道的)。您只需按原样将日期字符串馈送到构造函数中即可:DateTimeDateTime

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

编辑 (2014-05-07):

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

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

答案 2

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


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

请考虑以下代码:

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

该位消除时区信息,该函数假定 GMT。strtotimedate_create

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

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

与该函数不同,该方法假定服务器的时区(在我的情况下是CET),而不是GMT。date_createsetTimestamp


明确设置时区

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

请考虑以下代码:

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

推荐