111

您知道如何将其转换为 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');

以上不正确。如果我遍历很多不同的日期,它都是相同的日期。

4

4 回答 4

190

您不需要将字符串转换为时间戳来创建DateTime对象(事实上,正如您所知,它的构造函数甚至不允许您这样做)。您可以简单地将日期字符串按DateTime原样输入构造函数:

// 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);
于 2012-08-20T13:57:11.190 回答
54

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


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

考虑以下代码:

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

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

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

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。


明确设置您的时区

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

考虑以下代码:

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
于 2016-02-20T16:28:52.630 回答
41

可能最简单的解决方案就是:

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

其中“U”表示 Unix 纪元。请参阅文档: http: //php.net/manual/en/datetime.createfromformat.php

于 2017-09-10T07:05:52.570 回答
0

这是我的解决方案:

    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);
    }
于 2018-05-17T13:59:34.333 回答