PHP时间戳到DateTime
Posted
技术标签:
【中文标题】PHP时间戳到DateTime【英文标题】:PHP Timestamp into DateTime 【发布时间】:2012-08-15 20:04:14 【问题描述】:您知道如何将其转换为 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】:这是我的解决方案:
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);
【讨论】:
【参考方案2】:虽然@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
【讨论】:
【参考方案3】:可能最简单的解决方案就是:
DateTime::createFromFormat('U', $timeStamp);
其中“U”表示 Unix 纪元。参见文档:http://php.net/manual/en/datetime.createfromformat.php
【讨论】:
此方法也忽略时区 @BoukeVersteegh 哪个没有? @BoukeVersteegh 这是一个 Unix 时间戳!,它可以让您在创建对象时摆脱时区问题。只需在调用->format()
之前使用->setTimezone
设置首选时区
@BoukeVersteegh 查看PHP manual 中的这个重要说明 "当$time 参数是UNIX 时间戳(例如@946684800)或指定时,$timezone 参数和当前时区将被忽略时区(例如 2010-01-28T15:00:00+02:00)。"
Unix 时间戳没有时区,根据定义它们始终是 UTC【参考方案4】:
您不需要将字符串转换为时间戳来创建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
构造函数确实支持直接从时间戳创建实例。根据this documentation,您需要做的就是在时间戳前面加上@
字符:
$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime('@' . $timestamp);
【讨论】:
这很好用。我以前试过这个,但一定没有给它足够的机会!!!谢谢:)) 请注意,new DateTime('@' . $timestamp)
和 $dt = new DateTime(); $dt->setTimestamp($timestamp)
处理时区的方式不同。详情请见我的回答@***.com/questions/12038558/…。
我认为new DateTime("@$timestamp")
可能更具可读性。以上是关于PHP时间戳到DateTime的主要内容,如果未能解决你的问题,请参考以下文章