Интервалы даты/времени php с подпиской

Мне нужна помощь, чтобы разобраться с этим. Я пытаюсь разработать что-то, что делает ежемесячную, еженедельную, ежеквартальную, годовую подписку. Мне нужно выяснить, когда следующая дата оплаты. Но я запутался в логике. Я могу легко вычислить год по исходной транзакции (<? echo date("Y-m-d",strtotime($charge_interval, strtotime($original_charge_time))); ?>), где $charge_interval — это «+3 месяца» или «+1 месяц» и т. д. Но… если прошло 3 месяца, я не могу просто использовать это уравнение, потому что оно покажет «следующую» дату как один месяц от оригинала. Любой совет?

РЕДАКТИРОВАТЬ: больше точности. Мои данные хранятся в БД, и мне нужно обеспечить получение «следующего» месяца, а не месяца с исходной даты. Скажем, сделка состоялась 15 ноября. Сейчас 6 июля. Я хочу, чтобы «следующая транзакция» указывалась на 15 июля, а НЕ на 15 декабря (именно это будет выполнено в приведенном выше коде), и чтобы было сказано: «у нас уже было 7 списаний до этого».


person dama_do_bling    schedule 06.07.2011    source источник
comment
Вы должны быть более конкретными в том, что вам нужно. Насколько я понимаю, у вас есть заказы(?), которые оплачиваются ежемесячно/еженедельно/ежеквартально/ежегодно, верно? Итак, вам нужен фрагмент, который рассчитывает даты следующей зарядки? Ваши данные хранятся в базе данных?   -  person deiga    schedule 07.07.2011


Ответы (4)


strtotime малоизвестен, но может оказаться очень полезным для такое использование.

РЕДАКТИРОВАТЬ: здесь может быть подсказка:

$charges = 0;
$now = time();
$next_charge_time = strtotime($original_charge_time);
while ($next_charge_time < $now)
{
    $charges++;
    $next_charge_time = strtotime($charge_interval, $next_charge_time);
}
$next_charge_time = date("m/d/Y", $next_charge_time);
echo "You have been charged $charges times since $original_charge_time.";
echo "<br/>";
echo "Next charge will be on $next_charge_time";
person Mathieu Rodic    schedule 06.07.2011
comment
Разве что-то вроде strtotime(+3 месяца, strtotime($original_charge_time)) не поможет? Я не понимаю, в чем ваша проблема, попытайтесь быть более точным... - person Mathieu Rodic; 07.07.2011
comment
отредактированный комментарий выше, чтобы привести пример. я уже использовал strtotime так, как вы описываете. но это не достигает того, что я хотел. - person dama_do_bling; 07.07.2011
comment
До сих пор не совсем ясны ваши мотивы. Но я думаю, что я понял из того, что вы прокомментировали пост Алексея, я редактирую свой. - person Mathieu Rodic; 07.07.2011
comment
Не работало. Извините, что я неясен, взгляните на отредактированный пример выше. Мне нужно только 2 вещи: когда в следующий раз клиент должен быть списан (исходя из даты начала, текущей даты и интервала) и сколько раз он уже был списан, если вообще. - person dama_do_bling; 07.07.2011
comment
Проверил, работает отлично. За исключением того, что не было указано количество раз, когда с клиента взималась плата (редактировалась). - person Mathieu Rodic; 07.07.2011
comment
Кридифф - отлично! $charges включает в себя первоначальный заряд? - person dama_do_bling; 07.07.2011

Разве в php нет функции dateadd для добавления количества месяцев к дате?

Как этот?

http://php.net/manual/en/function.date-add.php

person Nikki9696    schedule 06.07.2011

Используйте DateTime() с http://us3.php.net/manual/en/datetime.add.php

person Aleksey Korzun    schedule 06.07.2011
comment
Но.. Как я могу обеспечить получение следующего месяца, а не месяца с исходной даты? Скажем, сделка состоялась 15 ноября. Сейчас 5 июня. Я хочу, чтобы следующая транзакция состоялась 15 июня, а НЕ 15 декабря, и чтобы у нас уже было 5 интервалов до... - person dama_do_bling; 07.07.2011
comment
Вам нужно записать исходную дату, добавить к ней x месяц цикла выставления счетов, и если он больше или равен текущей дате, вам нужно выставить счет клиенту. - person Aleksey Korzun; 07.07.2011

Попробуйте mktime(0, 0, 0, strftime("%d", $origtime), date("m")+1, date("Y"));

это будет означать полночь, конечно (первые три параметра - H, M, S, вы можете использовать strftime и для них, если хотите)

это будет работать для следующего календарного месяца, вы можете просто удалить «+1» для того же месяца, если вы решите, что день выпадает позже, чем текущий день.

person Keith Hall    schedule 06.07.2011