PHP夏令时问题


PHP Daylight Savings Time Issue

我有以下函数,用于获取正确的时间,并用于我的网站。不幸的是,它没有检查夏令时,并导致时间错误。我想知道是否有人能找到可能的解决方案或帮助我解决问题?

我对PHP编码很陌生,现在还在摸索。如果有人能帮我找到一种方法,让它在未来自动切换,那将非常有帮助。

以下是功能:

function getDSTDifference() {
    $timezone = date_default_timezone_get();
    $newTZ = new DateTimeZone($timezone);
    $trans = $newTZ->getTransitions();
    $offset = $trans[0]['offset'] /60 /60;
    return $offeset;
}

---编辑---

为了更好地澄清我想说的:

我有一个监控通话时间的网站。在夏令时和常规时间之间切换期间,这些通话时间将缩短一小时(反之亦然(。例如,上个周末导致时间显示为:-57:01:23。与其让函数保持原样——每次DST和Regular time切换时,我都必须手动进入并取消注释/注释掉两行代码,有没有可能的解决方案让函数能够自动执行这一操作?有点像一个更永久的解决方案。对我来说,必须不断地重新访问该函数,以一次又一次地进行看似简单的更改,这似乎是多余的编码。同样,我以前没有做过很多关于PHP代码的工作,因此我不熟悉可以使用的内置函数,也不熟悉是否必须自己创建。如果有人能提供一些信息/帮助,我们将不胜感激。

function getDSTDifference() {
    $timezone = date_default_timezone_get(); 
    $NewTZ = new DateTimeZone($timezone); 
    $transition = $NewTZ->getTransitions(); 
    $offset = $transition[0]['offset'] /60 /60; 
    //The following two lines need to be commented out when it is 
    //daylight savings time
    //They need to be uncommented when Daylight Savings Time ends
    $dst = $transition[0]['isdst']; 
    $offset = $offset - $dst;
    return $offset;
}

希望这更有意义!提前感谢您的帮助!

计算两个给定小时之间差异的一种可能性是使用DateTime::diff((。在写这个答案的时候,有一个PHP错误,你必须在之前转换为UTC

<?php
$zone = new DateTimeZone('Europe/Madrid');
$start = new DateTime('2013-03-31 1:59:00 ', $zone);
$end = new DateTime('2013-03-31 3:00:00', $zone);
// Workaround for bug #63953
// No longer required since PHP/5.6.0, PHP/5.5.8 or PHP/5.4.24
$start->setTimeZone(new DateTimeZone('UTC'));
$end->setTimeZone(new DateTimeZone('UTC'));
$difference = $start->diff($end);
echo $difference->format('%H:%I:%S');

打印00:01:00,因为那是夏令时在西欧开始的时候。

您也可以使用Unix时间戳,它表示一个固定的时刻,因此不依赖于时区:

<?php
$zone = new DateTimeZone('Europe/Madrid');
$start = new DateTime('2013-03-31 1:59:00 ', $zone);
$end = new DateTime('2013-03-31 3:00:00', $zone);
$difference = $end->format('U') - $start->format('U');
echo "$difference seconds";

打印CCD_ 3。


编辑#1:你的意思是什么?我的代码片段包含示例数据,因此您可以对其进行测试——在实际代码中,您将使用实际数据。您可以(也应该(将正确的时区设置为默认时区,这样就不需要每次都指定它。但即使你不这样做,服务器的时区也永远不会改变——即使你决定一年几次将计算机物理移动到另一个州或国家,你仍然可以选择自己选择的固定时区(你的应用程序的时区可能与服务器的时区不同(。

如果你真的想要一个需要每年手动更改代码两次的解决方案(无论出于何种原因,可能会收取维护费(,你最好跳过日期/时间函数,使用字符串;否则,您将冒着PHP为您进行计算的风险

编辑#2:

  1. $start$end表示您的数据。我选择了DST前一分钟的样本数据,只是为了说明diff代码工作得很好。这与您在PHP教程中看到<?php echo "Hello, World!"; ?>时的情况相同:Hello, World!是示例数据,用于说明echo的工作原理,但在编写应用程序时不必使用Hello, World!

  2. 要使用PHP从GMT转换为EST,您需要创建一个属于GMT:的日期

    $date = new DateTime('14:30', new DateTimeZone('GMT'));
    echo 'GMT: ' . $date->format('r') . PHP_EOL;
    // GMT: Thu, 07 Nov 2013 14:30:00 +0000
    

    然后切换到EST:

    $date->setTimeZone(new DateTimeZone('EST'));
    echo 'EST: ' . $date->format('r') . PHP_EOL;
    // EST: Thu, 07 Nov 2013 09:30:00 -0500
    

    但是,如果您的原始日期是GMT,则在减去日期之前将其转换为EST不会带来任何好处。