Итак, у меня есть следующий код:
$dateBase = $amount->getDate();
for ($i = 1; $i <= 3; $i++) {
$installment = new Installment();
if ($i == 1) {
//do stuff
} else {
var_dump('1-'.$dateBase->toString());
$dateBase->addMonth(1);
var_dump('2-'.$dateBase->toString());
}
$installment->setDate($dateBase);
$dataBase = clone $dataBase;
}
И вывод:
строка (25) «1 октября 2014 года, 12:00:00»
строка (25) «2 декабря 2014 года, 12:00:00»
строка (25) «1 декабря 2014 г., 00:00:00»
строка (26) «2 января 31, 2015 12:00:00»
Вы можете видеть, что во втором цикле (когда $ i = 2) он добавляет 2 месяца вместо одного
РЕДАКТИРОВАТЬ 1: Делая еще некоторые исследования, я думаю, что есть ошибка часового пояса, я изменил код следующим образом
$date = new Zend_Date('10/1/2014');
var_dump($date);
$date->addMonth(1);
var_dump($date, $dateBase);
$dateBase->addMonth(1);
var_dump($dateBase);
и вывод на это следует:
object(Zend_Date)#3754 (8) {
["_locale":"Zend_Date":private]=>
string(2) "en"["_fractional":"Zend_Date":private]=>
int(0)
["_precision":"Zend_Date":private]=>
int(3)
["_unixTimestamp":"Zend_Date_DateObject":private]=>
string(10) "1412114400"["_timezone":"Zend_Date_DateObject":private]=>
string(12) "Europe/Paris"["_offset":"Zend_Date_DateObject":private]=>
int(-3600)
["_syncronised":"Zend_Date_DateObject":private]=>
int(0)
["_dst":protected]=>
bool(true)
}
object(Zend_Date)#3754 (8) {
["_locale":"Zend_Date":private]=>
string(2) "en"["_fractional":"Zend_Date":private]=>
int(0)
["_precision":"Zend_Date":private]=>
int(3)
["_unixTimestamp":"Zend_Date_DateObject":private]=>
int(1414796400)
["_timezone":"Zend_Date_DateObject":private]=>
string(12) "Europe/Paris"["_offset":"Zend_Date_DateObject":private]=>
int(-3600)
["_syncronised":"Zend_Date_DateObject":private]=>
int(0)
["_dst":protected]=>
bool(true)
}
object(Zend_Date)#3755 (8) {
["_locale":"Zend_Date":private]=>
string(2) "en"["_fractional":"Zend_Date":private]=>
int(0)
["_precision":"Zend_Date":private]=>
int(3)
["_unixTimestamp":"Zend_Date_DateObject":private]=>
string(10) "1412114400"["_timezone":"Zend_Date_DateObject":private]=>
string(9) "Etc/GMT-2"["_offset":"Zend_Date_DateObject":private]=>
int(-7200)
["_syncronised":"Zend_Date_DateObject":private]=>
int(0)
["_dst":protected]=>
bool(true)
}
object(Zend_Date)#3755 (8) {
["_locale":"Zend_Date":private]=>
string(2) "en"["_fractional":"Zend_Date":private]=>
int(0)
["_precision":"Zend_Date":private]=>
int(3)
["_unixTimestamp":"Zend_Date_DateObject":private]=>
string(10) "1417384800"["_timezone":"Zend_Date_DateObject":private]=>
string(9) "Etc/GMT-2"["_offset":"Zend_Date_DateObject":private]=>
int(-7200)
["_syncronised":"Zend_Date_DateObject":private]=>
int(0)
["_dst":protected]=>
bool(true)
}
Вы можете видеть, что нет разницы между $ date и $ dataBase date, только часовой пояс, но когда мы добавляем один месяц к обоим, они реагируют по-разному, $ dateBase добавляется дополнительный месяц
Zend Framework 1.12 Документация Говорит что-то вроде этого:
Например, При добавлении одного месяца к 31 января люди, знакомые с SQL, ожидают в результате 28 февраля. С другой стороны, люди, знакомые с Excel и OpenOffice, ожидают 3 марта в результате. Проблема возникает только в том случае, если в полученном месяце нет дня, установленного в исходной дате.
Проверьте эту ссылку, если вы не знаете об этом:
http://framework.zend.com/manual/1.12/en/zend.date.overview.html
Других решений пока нет …