JRE*_*EAM 70 php datetime date date-format time-format
你知道如何将它转换为strtotime或类似的值传递给DateTime对象吗?
我有的日期:
Mon, 12 Dec 2011 21:17:52 +0000
Run Code Online (Sandbox Code Playgroud)
我尝试过的:
$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');
Run Code Online (Sandbox Code Playgroud)
以上是不正确的.如果我循环了很多不同的日期,那就是同一天.
FtD*_*Xw6 128
您不需要将字符串转换为时间戳来创建DateTime对象(实际上,它的构造函数甚至不允许您执行此操作,如您所知).您可以简单地将日期字符串按DateTime原样提供给构造函数:
// Assuming $item->pubDate is "Mon, 12 Dec 2011 21:17:52 +0000"
$dt = new DateTime($item->pubDate);
Run Code Online (Sandbox Code Playgroud)
话虽这么说,如果你有一个你希望使用的时间戳而不是字符串,你可以这样做DateTime::setTimestamp():
$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime();
$dt->setTimestamp($timestamp);
Run Code Online (Sandbox Code Playgroud)
编辑(2014-05-07):
我当时并没有意识到这一点,但DateTime构造函数确实支持直接从时间戳创建实例.根据此文档,您需要做的就是在时间戳前添加一个@字符:
$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime('@' . $timestamp);
Run Code Online (Sandbox Code Playgroud)
Joh*_*ers 30
虽然@drrcknlsn断言是正确的,但是有多种方法可以将时间字符串转换为数据时间,但重要的是要意识到这些不同的方法不会以相同的方式处理时区.
DateTime('@' . $timestamp)请考虑以下代码:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
Run Code Online (Sandbox Code Playgroud)
该strtotime位消除了时区信息,该date_create函数采用GMT(Europe/Brussels).
因此,无论我在哪台服务器上运行,输出都将如下:
2011-12-12T13:17:52+00:00
Run Code Online (Sandbox Code Playgroud)
date_create()->setTimestamp($timestamp)请考虑以下代码:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
Run Code Online (Sandbox Code Playgroud)
您可能希望这产生相同的输出.但是,如果我从比利时服务器执行此代码,我会得到以下输出:
2011-12-12T14:17:52+01:00
Run Code Online (Sandbox Code Playgroud)
与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')
Run Code Online (Sandbox Code Playgroud)
现在,还要考虑以下代码:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
Run Code Online (Sandbox Code Playgroud)
因为我们显式设置输出的时区以匹配输入的时区,所以两者都将创建相同(正确)的输出:
2011-12-12T21:17:52+08:00
Run Code Online (Sandbox Code Playgroud)
for*_*erg 17
可能最简单的解决方案就是:
DateTime::createFromFormat('U', $timeStamp);
Run Code Online (Sandbox Code Playgroud)
其中'U'表示Unix时代.请参阅docs:http://php.net/manual/en/datetime.createfromformat.php