1

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

我对 PHP 编码非常陌生,并且仍然在使用它。如果有人能够帮助我用一种方法让它在未来自动切换,那将非常有帮助。

这是功能:

function getDSTDifference() {
    $timezone = date_default_timezone_get();

    $newTZ = new DateTimeZone($timezone);
    $trans = $newTZ->getTransitions();

    $offset = $trans[0]['offset'] /60 /60;

    return $offeset;
}

- -编辑 - -

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

我有一个监控通话时间的网站。在 DST 和常规时间之间切换(反之亦然)期间,这些呼叫时间会减少一个小时。例如,上周末导致时间显示如下:-57:01:23. 而不是拥有它的功能 - 每次 DST 和常规时间切换时我都必须手动进入并取消注释/注释掉两行代码,是否有可能的解决方案使该功能能够做到这是自动的?有点像一个更永久的解决方案。对我来说,必须不断地重新访问该功能以一遍又一遍地进行看似简单的更改,这似乎是多余的编码。同样,我之前没有用 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;
}

希望这更有意义!在此先感谢您的帮助!

4

1 回答 1

3

计算两个给定小时之间差异的一种可能性是使用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,因为那是 DST 在西欧开始的时候。

您还可以使用 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";

...打印60 seconds


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

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

编辑#2:

  1. $start$end代表您的数据。我在 DST 前一分钟选择了示例数据,只是为了说明差异代码工作正常。<?php echo "Hello, World!"; ?>它与您在 PHP 教程中看到的相同:Hello, World!是用于说明如何echo工作的示例数据,但您不必Hello, World!在编写应用程序时使用。

  2. 要使用 PHP 从GMTto转换,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 并不会带来任何好处。

于 2013-11-06T17:13:30.250 回答