В настоящее время у меня есть код, который автоматически меняет номер месяца и таблицу MYSQL каждый месяц, но таймер, который он показывает, все еще сбрасывается каждые 24 часа. Мне нужно сделать так, чтобы таймер сбрасывался каждый месяц, а не каждые 24 часа. Я не думаю прямо и нуждаюсь в некоторой помощи, разрешающей это.
В основном мне это нужно, так что $ month_end_time отсчитывает от 30 дней, 0 часов, 0 минут 0 секунд до 0 дней, 0 часов, 0 минут 0 секунд, а затем сбрасывается на 30 дней. В настоящее время он отсчитывается от 30 дней до 29 дней, а затем сбрасывается, как и из сценария, который сбрасывается каждые 24 часа, и я переношу его на ежемесячный.
Кредиты для @ElmoVanKielmo для исходного фрагмента.
Заранее спасибо.
define("FIRST_DAY_STRING", "2014-4-6"); define("SHIFT_DAYS", 'P30D'); define("TIME_SUFFIX", " 0:00:00 GMT+11:00"); $today = new DateTime(); $first_day = new DateTime(FIRST_DAY_STRING); $interval = $first_day->diff($today); $days = $interval->format('%R%a days'); $end_date = $today->add(new DateInterval(SHIFT_DAYS)); $month_number = floor(intval($days) / 30 + 1); $txid = "tx$month_number"; $month_end_time = $end_date->format('Yn-j'); $month_end_time .= TIME_SUFFIX;
Я подозреваю, что вы, возможно, переусердствовали, так как он включает в себя «даты». При перемещении в течение нескольких месяцев это может быть сложно, поскольку (как отмечает Raptor), месяцы имеют разное количество дней между собой.
Однако, исходя из ваших комментариев, вы фактически ищете количество 30-дневных периодов между датой и датой. Это можно сделать с помощью основных математических и временных меток Unix:
$start = strtotime('2012-04-12 00:00:00 GMT'); $today = strtotime('00:00:00 GMT'); $days = ($today - $start) / 60 / 60 / 24; $months = $days / 30; echo "<pre> Days: $days Months: $months ";
Это даст:
Days: 723 Months: 24.1
http://codepad.viper-7.com/KBVfqq
И если вы пытаетесь выяснить, сколько дней:
$start = strtotime('2012-04-12 00:00:00 GMT'); $today = strtotime('00:00:00 GMT'); $days = ($today - $start) / 60 / 60 / 24; $months = $days / 30; $months_days = floor($months) . " months, " . ($days - (floor($months) * 30)) . " days"; echo "<pre> Days: $days Months: $months Months and Days: $months_days ";
Предоставление:
Days: 723 Months: 24.1 Months and Days: 24 months, 3 days
http://codepad.viper-7.com/AdnFsu
Это означает, что между началом и сегодняшней датой было 24 полных 30-дневных периода, и в настоящее время мы находимся в 25-м периоде ( ceil($months)
). Это кажется достаточным для того, что вам нужно, хотя конкретное использование значения периода может потребовать лучшего объяснения.