0

为什么从“今天”一词创建的 DateTime 和代表“今天”的时间戳不相同?

$zone = 'US/Eastern';
$str = 'today';

$dt_zone = new DateTimeZone($zone);
$myDateTime = new DateTime($str, $dt_zone);

$my_stamp = $myDateTime->getTimestamp();

echo "from $my_stamp {$zone}:".$myDateTime->format('d-m-Y H:i:s') . "<br>";

我们得到了结果:来自 1383886800 美国/东部:08-11-2013 00:00:00

现在让我们创建相同的代码,但从收到的时间戳生成 DateTime:

$zone = 'US/Eastern';
$str = '@1383886800';

$dt_zone = new DateTimeZone($zone);
$myDateTime = new DateTime($str, $dt_zone);

$my_stamp = $myDateTime->getTimestamp();

echo "from $my_stamp {$zone}:".$myDateTime->format('d-m-Y H:i:s') . "<br>";

我们得到了不同的结果,但时间戳相同:我们得到了结果:从 1383886800 US/Eastern:08-11-2013 05:00:00

可能存在从时间戳创建日期时间对象的另一种方式?我稍后可以实现 $myDateTime->modify('2 pm'); 并接收修改后的时间戳(不知道如何,因为 $myDateTime->getTimestamp() 在修改前返回时间戳)

4

2 回答 2

0

IMO,像您在第二个示例中已经完成的那样输入时间戳是更好/更好的解决方案,而不是使用 method setTimestamp。您需要做的就是在该 DateTime 对象上设置时区,并调用setTimezone方法,就像这个 demo一样。

$myDateTime = new DateTime('@1383886800');
$myDateTime->setTimezone(new DateTimeZone('US/Eastern'));

创建 DateTime 对象时忽略时区的原因是,当应用 UNIX 时间戳作为输入时,使用默认时区 UTC 并忽略提供的时区。请参阅 $timezone 参数中的注释

The $timezone parameter and the current timezone are ignored when the $time 
parameter either is a UNIX timestamp (e.g. @946684800) or specifies a timezone 
(e.g. 2010-01-28T15:00:00+02:00).
于 2013-11-08T17:16:23.643 回答
0

看起来它忽略了你的时区。手册对此有评论。但是有一种设置时间戳的方法。这将有预期的结果

$zone = 'US/Eastern';

$dt_zone = new DateTimeZone($zone);
$myDateTime = new DateTime(null, $dt_zone);

$myDateTime->setTimestamp(1383886800); // Set from timestamp

$my_stamp = $myDateTime->getTimestamp();

echo "from $my_stamp {$zone}:".$myDateTime->format('d-m-Y H:i:s') . "\n";
于 2013-11-08T14:34:04.420 回答