Zend Date DST Bug 的解决方法

2024-07-03

我发现中的一个错误Zend_Date当设置的时间跨越 DST 更改时 http://zendframework.com/issues/browse/ZF-10584.

这是说明问题的代码:

date_default_timezone_set('America/New_York');

echo '<pre>';

// DST BEGINS '2012-03-11 02:00:00' - "Spring Forward"
$a = new Zend_Date('2012-03-11 00:00:00', 'yyyy-MM-dd HH:mm:ss');
$a->setTime('04:00:00', 'HH:mm:ss');
echo $a->toString('yyyy-MM-dd HH:mm:ss', 'iso')
        . ' // expected: 2012-03-11 04:00:00' . PHP_EOL;
$b = new Zend_Date('2012-03-11 04:00:00', 'yyyy-MM-dd HH:mm:ss');
$b->setTime('00:00:00', 'HH:mm:ss');
echo $b->toString('yyyy-MM-dd HH:mm:ss', 'iso')
        . ' // expected: 2012-03-11 00:00:00' . PHP_EOL;

// DST ENDS '2012-11-04 02:00:00' - "Fall Back"
$c = new Zend_Date('2012-11-04 00:00:00', 'yyyy-MM-dd HH:mm:ss');
$c->setTime('04:00:00', 'HH:mm:ss');
echo $c->toString('yyyy-MM-dd HH:mm:ss', 'iso')
        . ' // expected: 2012-11-06 04:00:00' . PHP_EOL;
$d = new Zend_Date('2012-11-04 04:00:00', 'yyyy-MM-dd HH:mm:ss');
$d->setTime('00:00:00', 'HH:mm:ss');
echo $d->toString('yyyy-MM-dd HH:mm:ss', 'iso')
        . ' // expected: 2012-11-06 00:00:00' . PHP_EOL;

echo '</pre>';

Ouputs:

2012-03-11 05:00:00 // expected: 2012-03-11 04:00:00
2012-03-10 23:00:00 // expected: 2012-03-11 00:00:00
2012-11-04 03:00:00 // expected: 2012-11-06 04:00:00
2012-11-04 01:00:00 // expected: 2012-11-06 00:00:00

我需要解决这个错误,但我很困惑。


SOLUTION

基于答案 https://stackoverflow.com/a/7183700/244826 from nerdzila https://stackoverflow.com/users/908930/nerdzila,并研究他的解决方案引入了一个错误 https://stackoverflow.com/q/8593660/244826,我现在在我的子类中有这个Zend_Date:

/**
 * Call the function twice to work around the DST bug
 * http://zendframework.com/issues/browse/ZF-10584
 * https://stackoverflow.com/questions/7181702/work-around-for-zend-date-dst-bug
 * https://stackoverflow.com/questions/8593660/zend-date-dst-bug-test-whether-a-date-is-a-time-change-date
 * TODO: remove this once the bug is fixed
 *
 * @param  string|integer|array|Zend_Date  $time    Time to set
 * @param  string                          $format  OPTIONAL Timeformat for parsing input
 * @param  string|Zend_Locale              $locale  OPTIONAL Locale for parsing input
 * @return My_Date Provides fluid interface
 * @throws Zend_Date_Exception
 */
public function setTime($time, $format = null, $locale = null)
{
    // start time zone juggling so that localtime() returns the correct results
    $tzOrig = date_default_timezone_get();
    date_default_timezone_set($this->getTimezone());

    // capture orignal info
    $timeInfoOrg = localtime($this->getTimestamp(), true);

    // set the time
    parent::setTime($time, $format, $locale);

    // if the dst has changed, perform workaround
    $timeInfoNew = localtime($this->getTimestamp(), true);
    if ((0 < $timeInfoOrg['tm_isdst']) != (0 < $timeInfoNew['tm_isdst'])) {
        // set the time again
        parent::setTime($time, $format, $locale);
        // if the day changed, set it back
        if ($timeInfoOrg['tm_yday'] != $timeInfoNew['tm_yday']) {
            // localtime() year date is zero indexed, add one
            $this->setDayOfYear($timeInfoOrg['tm_yday'] + 1);
        }
    }

    // end time zone juggling
    date_default_timezone_set($tzOrig);

    // fluent
    return $this;
}

一旦错误修复,我可以简单地删除它。


这是一个不幸的错误。我通过打电话解决了这个问题setTime()每个日期两次:

...
$a->setTime('04:00:00', 'HH:mm:ss');
$a->setTime('04:00:00', 'HH:mm:ss');
...
$b->setTime('00:00:00', 'HH:mm:ss');
$b->setTime('00:00:00', 'HH:mm:ss');
...
$c->setTime('04:00:00', 'HH:mm:ss');
$c->setTime('04:00:00', 'HH:mm:ss');
...
$d->setTime('00:00:00', 'HH:mm:ss');
$d->setTime('00:00:00', 'HH:mm:ss');
...

我的结果:

2012-03-11 04:00:00 // expected: 2012-03-11 04:00:00
2012-03-10 00:00:00 // expected: 2012-03-11 00:00:00
2012-11-04 04:00:00 // expected: 2012-11-04 04:00:00
2012-11-04 00:00:00 // expected: 2012-11-04 00:00:00
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Zend Date DST Bug 的解决方法 的相关文章

随机推荐

  • SendKeys 通过 Access 表单中的 VBA 代码弄乱了我的 NumLock 键

    I have the following code for an Access form It appears as if the SendKeys is messing with my NumLock key by toggling it
  • React Native + Appium iOS elementByAccessibilityId.text()

    我正在使用 Appium Jest 为 Android 和 iOS 编写 React Native 测试 这是我的 React Native 元素
  • React Native + Appium iOS elementByAccessibilityId.text()

    我正在使用 Appium Jest 为 Android 和 iOS 编写 React Native 测试 这是我的 React Native 元素
  • Mysql查询。连接和子查询有什么区别?

    我总是认为 join 会得到某些结果 然后仅使用这些结果进行连接 SELECT FROM tbl AS t1 JOIN tbl2 AS t2 ON t1 id t2 foreignId JOIN tbl3 AS t3 ON t2 id t3
  • Mysql查询。连接和子查询有什么区别?

    我总是认为 join 会得到某些结果 然后仅使用这些结果进行连接 SELECT FROM tbl AS t1 JOIN tbl2 AS t2 ON t1 id t2 foreignId JOIN tbl3 AS t3 ON t2 id t3
  • 如何在Rails启动时创建线程?

    我试图在 Rails 启动时创建一个线程 该线程将在应用程序的整个生命周期中运行 奇怪的是 我已经将其与我正在运行的另一个线程一起使用了 我复制了该 工作 代码并将其用作新线程的新代码的样板 但线程不会启动 代码位于配置 初始化程序中 这是
  • 如何在Rails启动时创建线程?

    我试图在 Rails 启动时创建一个线程 该线程将在应用程序的整个生命周期中运行 奇怪的是 我已经将其与我正在运行的另一个线程一起使用了 我复制了该 工作 代码并将其用作新线程的新代码的样板 但线程不会启动 代码位于配置 初始化程序中 这是
  • 如何使用 numpy.void 类型

    我加载了一个MATLAB mat文件通过scipy io loadmat它给了我一个清单numpy void对象 它们是什么 如何使用以及在哪里可以得到一些参考文档在他们 根据numpy文档 http docs scipy org doc
  • 如何使用 numpy.void 类型

    我加载了一个MATLAB mat文件通过scipy io loadmat它给了我一个清单numpy void对象 它们是什么 如何使用以及在哪里可以得到一些参考文档在他们 根据numpy文档 http docs scipy org doc
  • git 切换分支而不丢弃本地更改

    好吧 假设有一天我们碰巧做了一堆修改 当我们去提交它们时 我们注意到我们正在错误的分支上工作 我们如何强制git切换分支不丢弃本地更改 在等待回复时 我可能会以一种天真的方式解决这个问题 但我想知道是否有正确的程序 因为如果我说这之前没有发
  • git 切换分支而不丢弃本地更改

    好吧 假设有一天我们碰巧做了一堆修改 当我们去提交它们时 我们注意到我们正在错误的分支上工作 我们如何强制git切换分支不丢弃本地更改 在等待回复时 我可能会以一种天真的方式解决这个问题 但我想知道是否有正确的程序 因为如果我说这之前没有发
  • 具有 SHA-1 的 .NET RSACryptoServiceProvider 的 Java 等效项

    我有以下 C 数据签名代码 RSACryptoServiceProvider rsa new RSACryptoServiceProvider string PrivateKeyText
  • 具有 SHA-1 的 .NET RSACryptoServiceProvider 的 Java 等效项

    我有以下 C 数据签名代码 RSACryptoServiceProvider rsa new RSACryptoServiceProvider string PrivateKeyText
  • 如何使用 Async Retrofit 2.0 返回值

    我是改造新手 我有一个异步改造功能 目的如下示例 public boolean bookmark boolean result false Call
  • 如何使用 Async Retrofit 2.0 返回值

    我是改造新手 我有一个异步改造功能 目的如下示例 public boolean bookmark boolean result false Call
  • Django modelform 如何添加确认密码字段?

    这里我需要额外添加一个confirmation password在我的表单中 我使用了 Django 的模型表单 我还需要验证这两个密码 如果出现以下情况 它必须引发验证错误password1 password2 这是我的 forms py
  • Django modelform 如何添加确认密码字段?

    这里我需要额外添加一个confirmation password在我的表单中 我使用了 Django 的模型表单 我还需要验证这两个密码 如果出现以下情况 它必须引发验证错误password1 password2 这是我的 forms py
  • 为什么二进制文件在压缩时会损坏?

    我有一项通过网络提供压缩文件的服务 该 zip 包含 Windows 平台的可执行文件 我正在使用 RubyZip 库来压缩文件 但该过程会损坏二进制文件 在我的本地服务器上 我们通过系统调用使用 zip 命令 它工作正常 zip 命令在
  • 为什么二进制文件在压缩时会损坏?

    我有一项通过网络提供压缩文件的服务 该 zip 包含 Windows 平台的可执行文件 我正在使用 RubyZip 库来压缩文件 但该过程会损坏二进制文件 在我的本地服务器上 我们通过系统调用使用 zip 命令 它工作正常 zip 命令在
  • Zend Date DST Bug 的解决方法

    我发现中的一个错误Zend Date当设置的时间跨越 DST 更改时 http zendframework com issues browse ZF 10584 这是说明问题的代码 date default timezone set Ame