【问题标题】:PHP Daylight Savings Time IssuePHP夏令时问题
【发布时间】:2013-11-15 09:11:43
【问题描述】:

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

我对 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;
}

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

【问题讨论】:

  • 这个函数应该做什么?老实说,我无法从当前代码中推断出它,而且您的文字描述非常模糊。
  • echo $timezone; 的输出是什么?
  • @geomagas - 当我添加 echo $timezone; 时,我无法在我的 chrome 控制台中输出任何内容。你有什么想法吗?
  • @ÁlvaroG.Vicario - 请参阅我上面的编辑。希望这对我正在尝试做的事情更有意义。如果我仍然太模糊,请告诉我。

标签: php dst


【解决方案1】:

计算两个给定小时之间差异的一种可能性是使用DateTime::diff()。在撰写此答案时,a PHP bug 之前您必须转换为 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:你是什么意思?我的 sn-p 包含示例数据,因此您可以对其进行测试——在真实代码中,您将使用真实数据。您可以(并且应该)set the correct time zone as default,因此您不需要每次都指定它。但即使你不这样做,服务器的时区也永远不会改变——即使你决定每年将计算机物理移动到另一个州或国家多次,你仍然可以选择你选择的固定时区(你的应用程序的时间区域可以与您的服务器不同)。

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

编辑#2:

  1. $start$end 代表您的数据。我在 DST 前一分钟选择了示例数据,只是为了说明差异代码工作正常。这与您在 PHP 教程中看到 &lt;?php echo "Hello, World!"; ?&gt; 时的情况相同: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 不会带来任何好处。

【讨论】:

  • 谢谢您,非常感谢您的帮助。我对此的唯一后续问题是:通过设置$start$end 日期,这是否意味着我需要每年手动输入并将日期更改为正确的 DST 日期?如果是这样,有没有办法做类似的事情?
  • @scapegoat17 - 我已经编辑了我的答案,但我不太明白你的后续问题是什么意思。你有其他编程语言的经验吗?也许您应该解释一下您将如何在其他语言中使用它,我们可以帮助您将其移植到 PHP。但我的代码完全符合我假设您的要求:计算两个日期之间的差异。如果您需要进一步说明以了解它是如何工作的,请随时询问,但硬编码 DST 内容很疯狂,因为 PHP 可以为您完成。
  • 我认为我之前所说的可能是我们的错误。我只是想确保它不是硬编码的,而且我不必每年都更改日期。例如,今年 DST 结束 2013-11-03 2:00:00' and next year it will be 2013-11-02 2:00:00' 那么由于实际日期每年都在变化,我是否必须每年更改 $start$end 日期?我很抱歉我没有做这样的事情的经验......我只是想更好地理解它是如何工作的,并学习如何正确地做到这一点。为了回答你的问题,我做了类似的事情
  • 之前使用 C#/Dot NET 进行过一次。我必须解析 XML 文件并将日期格式从 GMT 转换为 EST。这似乎用TimeZoneInfo 自动解释了夏令时。除此之外,我在编码方面几乎没有处理 DST 的经验,这就是为什么我的问题听起来很愚蠢/愚蠢的原因。
  • @scapegoat17 - 查看我的第二次编辑(我没有解释如何解析 XML,但我知道你没有问这个)。
猜你喜欢
  • 2010-09-27
  • 2017-03-14
  • 2014-03-23
  • 2012-09-13
  • 2016-07-28
  • 2011-04-07
  • 2015-06-07
  • 2011-11-20
  • 2011-11-20
相关资源
最近更新 更多