PHP时间戳到DateTime

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)

  • 注意`new DateTime('@'.$ timestamp)`和`$ dt = new DateTime(); $ dt-> setTimestamp($ timestamp)`不要以同样的方式处理时区.有关详细信息,请参阅我的答案@ http://stackoverflow.com/questions/12038558/php-timestamp-into-datetime/35525866#35525866. (9认同)

Joh*_*ers 30

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


选项1 : 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)

选项2: 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

  • @BoukeVersteegh 这是一个 Unix 时间戳!,**它可以让您在创建对象时摆脱时区问题**。只需在调用 `->format()` 之前使用 `->setTimezone` 设置首选时区 (5认同)
  • 此方法也忽略时区 (4认同)
  • Unix 时间戳没有时区,根据定义它们始终是 UTC (3认同)
  • @BoukeVersteegh和哪一个不? (2认同)
  • @BoukeVersteegh 从 [PHP 手册](https://www.php.net/manual/en/datetime.construct.php) 检查这个大注释 **“当 $time 时,$timezone 参数和当前时区将被忽略参数可以是 UNIX 时间戳(例如 @946684800),也可以指定时区(例如 2010-01-28T15:00:00+02:00)。 "** (2认同)