使用DateTime :: createFromFormat()进行PHP时间戳转换

时间:2015-02-10 16:48:41

标签: php timestamp

此代码:

$timestamp = 1423522800;  // Timestamp for 2015-02-10
$date1 = DateTime::createFromFormat('U', $timestamp);

echo $date1->format('d/m/Y H:i') . "\n";
echo $date1->format('U') . "\n\n";

$date2 = new DateTime('2015-02-10');

echo $date2->format('d/m/Y H:i') . "\n";
echo $date2->format('U') . "\n";

给我这个输出:

09/02/2015 23:00
1423522800

10/02/2015 00:00
1423522800

到底是怎么回事?

我认为它的时区相关,但是来自DateTime :: createFromFormat()文档:

  

注意:时区参数和当前时区被忽略   time参数包含UNIX时间戳(例如946684800)或   指定时区(例如2010-01-28T15:00:00 + 02:00)。

我正在使用PHP 5.5.9-1ubuntu4.5

1 个答案:

答案 0 :(得分:0)

使用UNIX时间戳中的DateTime对象时

$timestamp = 1423522800;  // Timestamp for 2015-02-10
$date1 = DateTime::createFromFormat('U', $timestamp);

$date1 = new DateTime('@'.$timestamp);

$date1 = date_create('@'.$timestamp);

创建后,对象的时区始终为+00:00或UTC。即使在创建对象时指定了时区,使用时间戳时也会忽略该时区。

$timestamp = 1423522800;  // Timestamp for 2015-02-10
$date1 = DateTime::createFromFormat('U', $timestamp, new DateTimeZone('Europe/Madrid'));

var_dump($date1);

输出:

object(DateTime)#3 (3) {
  ["date"]=>
  string(26) "2015-02-09 23:00:00.000000"
  ["timezone_type"]=>
  int(1)
  ["timezone"]=>
  string(6) "+00:00"
}

要获取本地时间,必须在创建DateTime之后设置时区。

$date = date_create('@1423522800')
  ->setTimeZone(new DateTimeZone('Europe/Madrid'));

var_dump($date);

现在该对象具有预期的时间和时区。

object(DateTime)#2 (3) {
  ["date"]=>
  string(26) "2015-02-10 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Madrid"
}