2012-11-07 57 views
1

我一直在用PHP的DateTime类挣扎了好一阵子。我的理解是,无论时区如何,UNIX-timstamp始终都是UTC。为什么getTimestamp()会影响setTimezone()

这就是为什么我很困惑这个代码示例。

$date1 = new DateTime("@1351382400"); // Sun Oct 28 2012 02:00:00 GMT+2 (DST) 
var_dump($date1->getTimestamp()); //prints: 1351382400 
$date1->setTimezone(new DateTimeZone("Europe/Stockholm");); 
var_dump($date1->getTimestamp()); //prints: 1351386000 

正如您所看到的,setTimezone()更改getTimestamp()的结果。

预计setTimezone()会影响getTimestamp()吗?

+0

向日光节约转换问好。 – salathe

+0

当然,但它是预期的? – luttkens

+0

显然不是你的,这是重要的。 – salathe

回答

1

您关闭的金额为3600秒或1小时。

我认为,你看到的是因为你选的日期是夏令时在斯德哥尔摩结束。如果你使用一个不同的日期,你没有得到这样的效果:

$now = time(); 
echo "   now: $now\n"; 

$date1 = new DateTime("@{$now}"); 
echo "  date1 here: {$date1->getTimestamp()}\n"; 
$date1->setTimezone(new DateTimeZone("Europe/Stockholm")); 
echo "date1 Stockholm: {$date1->getTimestamp()}\n"; 

输出:

  now: 1352321491 
    date1 here: 1352321491 
date1 Stockholm: 1352321491 

我不知道这是否是一个错误或没有,但它不会发生如果你没有选择DST改变的日期。

+0

的确如此,但似乎有点不一致。我在全年处理时间序列 - 每年两天这对我来说是一个问题。那么,意识到是否能够解决问题。 – luttkens

+0

根据[这个PHP bug](https://bugs.php.net/bug.php?id=51051) – slashingweapon

+0

这似乎是一个已知的问题啊,那么它是一个错误。感谢您发现! – luttkens

0

是的,unix timestamp是根据日期对象的当前时间或您当前的Epoch机器时间。

+0

好的,在这种情况下,setTimezone()不应该影响getTimestamp()返回的unix时间戳吗?那么它是一个错误? – luttkens

相关问题