【问题标题】:Zend_Date, ISO_8601, date parsing and local system clockZend_Date、ISO_8601、日期解析和本地系统时钟
【发布时间】:2013-01-31 13:16:58
【问题描述】:

我对 Zend_Date 对象有一个奇怪的问题。

似乎设置器使用不同的系统时钟日期执行不同的操作。 假设系统日期为 2013 年 1 月 28 日,代码如下:

$now=new Zend_Date(Zend_Date::ISO_8601);
$now->now();
echo '<br/>now: ' . $now->toString();
echo '<br/>now->day: ' . $now->get(Zend_Date::DAY);
echo '<br/>now->month: ' . $now->get(Zend_Date::MONTH);
echo '<br/>now->year: ' . $now->get(Zend_Date::YEAR);
$end=new Zend_Date('2013-02-25 14:23:34', Zend_Date::ISO_8601);
echo '<br/>end: ' . $end->toString();
$end->setHour('23')->setMinute('59')->setSecond('59')->setDay($now->get(Zend_Date::DAY))->setMonth($now->get(Zend_Date::MONTH))->setYear($now->get(Zend_Date::YEAR));
echo '<br/>endAfterSetters: ' . $end->toString();

将产生以下输出:

now: 28-01-2013 14:04:28
now->day: 28
now->month: 01
now->year: 2013
end: 25-02-2013 14:23:34
endAfterSetters: 28-01-2013 23:59:59

但如果您将系统时钟更改为 2013 年 1 月 29 日,则输出与预期不同:

now: 29-01-2013 14:07:22
now->day: 29
now->month: 01
now->year: 2013
end: 25-02-2013 14:23:34
endAfterSetters: 01-01-2013 23:59:59

最后输出是 01-01-2013 23:59:59,但应该是 29-01-2013 23:59:59 !

它发生在 PHP 5.3.2 和 5.3.16、Zend_Framework 10.7、Zend_Date 24880 最新版本上。

过去一切都很好。

任何想法为什么会发生?

P.S.:我在 1 月 29,30,31 日使用 jquery datatime 插件时也发现了故障......但我将在其他问题中描述它。

【问题讨论】:

    标签: php zend-framework zend-date


    【解决方案1】:

    请记住,您的 setter 是按顺序调用的。因此,当您致电 setDay(29) 时,您是在告诉它将日期更改为 2013 年 2 月 29 日,这不是一个有效的日期,所以它会将其转为 2013 年 3 月 1 日。然后您致电setMonth(1),它将月份更改为一月,为您提供2013 年 1 月 1 日

    您可以通过将 extend_month 选项传递给 Zend_Date 构造函数来控制此行为,请参阅:http://framework.zend.com/manual/1.12/en/zend.date.overview.html#zend.date.options.extendmonth

    【讨论】:

    • 确实如此。二传手顺序是问题所在。重新排序到 setMonth($m)->setDay($d) 解决了它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-02-05
    • 2018-12-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多