将PHP时间戳转换为DateTime

5tmbdcev  于 2022-10-30  发布在  PHP
关注(0)|答案(4)|浏览(184)

您知道如何将其转换为strtetime或类似类型的值以传递给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');

上面的是不正确的。如果我循环通过很多不同的日期,它都是相同的日期。

wnrlj8wa

wnrlj8wa1#

为了创建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年5月7日):

实际上,我当时并不知道这一点,但是DateTime构造函数 * 确实 * 支持直接从时间戳创建示例。根据this documentation,您所需要做的就是在时间戳前面加上一个@字符:

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

xjreopfe2#

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

选项1:strtotime

请考虑以下代码:

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

strtotime位消除时区信息,date_create函数假定为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');

您可能希望这会产生相同的输出。但是,如果我在比利时服务器上执行这段代码,我会得到以下输出:

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
bq9c1y66

bq9c1y663#

大概最简单的解决办法只是:

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

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

eit6fx6z

eit6fx6z4#

这是我的解决方案:

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

相关问题