Скрипт расчета времени

Niemand

Новичок
Скрипт расчета времени

Приветствую. у меня такой вопросик, сделал скрипт, который расчитывает дату через заданное кол-во месяцев (дата хранится в UNIX Timestamp). Все вроде работает, но вот глюк откопал, что при пересчете почти одинаковых дат (разница в минутах) он считает по разному.

PHP:
function months_add($timevar, $mons){
  echo $timevar."<br>";
  $day_length=60*60*24; //Секунд в дне
  for($k=1;$k<=$mons;$k++){
  $days_in_month=date("t", $timevar); //Дней в актуальном месяце
  echo date("d.m.Y", $timevar)." ".$days_in_month."<br>";
  $timevar=$timevar + ($day_length*$days_in_month); //Дата через $k месяцев  
}
return $timevar;
}
и вот для сравнения таблицы:
пример 1:
Время: 1186387567 (12:05:36) (Время взято из time() )
(Дата через $i месяцев / кол-во дней в месяц)
06.08.2007 31
06.09.2007 30
06.10.2007 31
06.11.2007 30
06.12.2007 31
06.01.2008 31
06.02.2008 29
06.03.2008 31
06.04.2008 30
06.05.2008 31
06.06.2008 30
06.07.2008 31
06.08.2008 31
06.09.2008 30
06.10.2008 31
06.11.2008
(Все пересчитывает верно)

и вторая таблица:
1186344000 (11:49:07)
06.08.2007 31
06.09.2007 30
06.10.2007 31
05.11.2007 30
05.12.2007 31
05.01.2008 31
05.02.2008 29
05.03.2008 31
06.04.2008 30
06.05.2008 31
06.06.2008 30
06.07.2008 31
06.08.2008 31
06.09.2008 30
06.10.2008 31
(откуда-то берутся пятерки).
В чем может быть причина?

заранее спасибо за ответ.
 

aleks_raiden

Новичок
гм... а разве нельз воспользоватся стандартными функциями работы с датами в базе? если уже исходные данные оттуда берутся? вроде как в MySQL есть очень мощные и удобные функции для работы с датами.
 

SiMM

Новичок
> В чем может быть причина?
Часовой пояс + переход на летнее время.

> расчитывает дату через заданное кол-во месяцев
А что Вы будете делать с датами больше 28?
 

Niemand

Новичок
с MySQL мне еще разбираться и разбираться, к сожалению, времени на это не хватает. пока нужен ответ по этому варианту

-~{}~ 06.08.07 12:10:

Автор оригинала: SiMM
> В чем может быть причина?
Часовой пояс + переход на летнее время.

> расчитывает дату через заданное кол-во месяцев
А что Вы будете делать с датами больше 28?
А почему в 1м варианте не считает переход времени?
часовой пояс один, он не меняется.

а что с датами больше 28и?

1177790400
29.04.2007 30
29.05.2007 31
29.06.2007 30
29.07.2007 31
29.08.2007 31
29.09.2007 30
28.10.2007 31
28.11.2007 30
28.12.2007 31
28.01.2008 31
28.02.2008 29
28.03.2008 31
29.04.2008 30
29.05.2008 31
29.06.2008 30

считает также, но идет переход... кстати, очень похоже на переход на летнее/зимнее время... но почему же при time() он не переводит? и почему он переводит на день, а не на час? О.О
 

SiMM

Новичок
> часовой пояс один, он не меняется.
Вообще-то если Вы не заметили - я говорил о совокупности двух факторов, а не о каждом в отдельности.

> но почему же при time() он не переводит?
http://phpclub.ru/talk/showthread.php?postid=735388#post735388

> и почему он переводит на день, а не на час?
Потому что Вы время выводите с точностью до дня, посему не можете говорить о том, что перевод происходит на день, а не на час.
 

Gorynych

Посетитель PHP-Клуба
я в таких случаях пользуюсь довольно умной ф-ей mktime, которая сама прекрасно разбирается в переходах по месяцам и т.п.

PHP:
$t = time();
echo nl2br("$t\n");
list($day,$month,$year) = split("\.", date("d.m.Y", $t));

$months = 10;
for($i=1; $i<=$months; $i++) {
	$new_t = mktime(0,0,0,$month+$i,$day,$year);
	echo nl2br(date("d.m.Y", $new_t)." ".date("t", $new_t)."\n");
}
P.S. вопрос о том, какое число будет через месяц после 30 января - чисто филосовский, я думаю что это будет уже март, и не вижу тут большого криминала.
 

Niemand

Новичок
Все. я дотормозил... фишка в том, что при сохранении в базу данных идет пересчет обычного времени в TIMESTAMP, при этом время берется 00:00:00, конечно идет смещение по летнему/зимнему времени.

SiMM, спасибо, доходчиво.
Gorynych, спасибо, переработаю немного Ваш вариант.
 
Сверху