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的主要内容,如果未能解决你的问题,请参考以下文章

Unix 时间戳到 PHP 年月日转换关闭

从时间戳到正常日期[重复]

JavaScript 时间戳到 Python 日期时间的转换

Python:从时间戳到日期时间

在 SQL Server 中添加时间戳到日期

从 BigQuery 格式化时间戳到 Google 电子表格