Список всех месяцев и года между двумя датами в PHP - PullRequest
4 голосов
/ 19 сентября 2009

Я пытаюсь объяснить детали, чтобы это было легко понять.

Мне нужен список месяца и года, основанный на разнице месяца и года.

Я реализую функциональность поиска на основе начального месяца с годом и конечного месяца с годом. Так!

начало выбора - 01 (месяц) -2009 (год)

Окончание выбора 10 (месяц) -2009 (год)

Что я хочу от MySQL:

Month                        Year
JAN                          2009
FEB                          2009
MAR                          2009
APR                          2009
MAY                          2009
JUN                          2009
JUL                          2009
AUG                          2009
SEP                          2009
OCT                          2009

Ответы [ 7 ]

9 голосов
/ 20 сентября 2009

Ответ FractalizeR правильный.

Просто позвольте мне расширить, определив функции:

function GetMonthsFromDate($myDate) {
  $year = (int) date('Y',$myDate);
  $months = (int) date('m', $myDate);
  $dateAsMonths = 12*$year + $months;
  return $dateAsMonths;
}

function GetDateFromMonths($months) {
  $years = (int) $months / 12;
  $month = (int) $months % 12;
  $myDate = strtotime("$years/$month/01"); //makes a date like 2009/12/01
  return $myDate;
}

PS: попытался опубликовать комментарий, но форматирование было испорчено. (Конечно, эти функции можно было бы переписать как один вкладыш, но хотелось бы, чтобы они были более читабельными)

8 голосов
/ 20 сентября 2009

Хотя ответ FractalizeR является правильным. Есть еще один вариант.

Воспользовавшись тем, что это strtotime ('2009/08/01 - 1 месяц') будет делать правильные вещи и удалит 1 месяц.

<?php
$startDate = strtotime("$startYear/$startMonth/01");
$endDate   = strtotime("$endYear/$endMonth/01");

$currentDate = $endDate;

while ($currentDate >= $startDate) {
    echo date('Y/m',$currentDate);
    $currentDate = strtotime( date('Y/m/01/',$currentDate).' -1 month');
}

Опять список месяцев

8 голосов
/ 19 сентября 2009

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

Jan 1980 = 0;
Dec 1980 = 12;
Jan 1981 = 13 etc.

Тогда вы просто делаете простой цикл for:

for ($i = GetMonthsFromDate($StartDate), $i <= GetMonthsFromDate($StopDate), $i++) {
   echo(GetDateFromMonths($i));
}
2 голосов
/ 20 сентября 2009

Вот окончательный ответ, который работал очень хорошо

$startMonth= $_POST['startmonth'];
    $startyear= $_POST['startyear'];
    $cYear = $startyear;

    $endMonth= $_POST['endmonth'];
    $endyear= $_POST['endyear'];
    $sql = "SELECT PERIOD_DIFF(".$endyear.$endMonth.", ".$startyear.$startMonth.")";
    $queryRS =  $db->query($sql);
    $tmonthsarray = $db->fetchRow($c_jobsVat);
    $totalmonths=tmonthsarray[0];
         for($count=$startMonth; $count <= ($startMonth + $totalmonths);$count++)
         {  
            $processYear = $startyear + intval( ( $count - 1 ) / 12 );
        $processMonth= (( $count - 1 ) % 12 + 1);
        $processMonthName= date('F', mktime(0,0,0,$count));
         }
1 голос
/ 05 октября 2010

Я написал эту функцию, основываясь на ваших комментариях. Проверьте это:

function CountTheMonth($startDate,$endDate,$order)
{
    $startDate = strtotime($startDate);
    $endDate   = strtotime($endDate);

    $ASC_Month = $startDate;
    $DESC_Month = $endDate;
    $Y_Axis = Array();

    if($order == 'DESC')//Big to small
    {
        while ($DESC_Month >= $startDate) 
        {    
            $Y_Axis[] = date('F-Y',$DESC_Month);
            $DESC_Month = strtotime( date('Y-m-d',$DESC_Month).' -1 month');
        }
        return $Y_Axis;
    }
    elseif($order == 'ASC')//Small to big
    {
        while ($ASC_Month <= $endDate) 
        {    
            $Y_Axis[] = date('F-Y',$ASC_Month);
            $ASC_Month = strtotime( date('Y-m-d',$ASC_Month).' +1 month');
        }
        return $Y_Axis;
    }
}
0 голосов
/ 25 января 2015

Я определенно согласен с решением @FractalizeR и добавлением @elviejo, оно помогло мне двигаться вперед. Но я считаю, что столкнулся с некоторыми проблемами, и они могут помочь другим: (+ поправьте меня, если я ошибаюсь)

  1. Важно отметить: и $StartDate, и $StopDate относятся к типу timestamp, но на самом деле не date -тип (1) . Поэтому я изменил параметры функции на $myTimestamp в надежде не запутать других.

Например:

$StartDate = strtotime("Sept 2010");
$StopDate = time(); // current timestamp
  1. Для функций @elviejo:
    1. приведение типов: простой (int) не работал для меня (PHP5), поэтому я использовал intval() вместо
    2. Работа с % дает результаты в диапазоне от 0 до 11, а месяцы в диапазоне от 1 до 12 (2) . Таким образом, в функции GetDateFromMonths($months) мы должны +1 результат
    3. Поскольку мы добавляем 1 к % в функции GetDateFromMonths($months), нам придется вычесть 1 из $dateAsMonths в функции GetMonthsFromDate($myTimestamp).

Это дает мне следующий код:

function GetMonthsFromDate($myTimestamp)
{
  $year = (int) date('Y',$myTimestamp);
  $months = (int) date('m', $myTimestamp);
  $dateAsMonths = 12*$year + $months - 1;
  return $dateAsMonths;
}

function GetDateFromMonths($months)
{
  $years = intval($months / 12);
  $month = intval($months % 12) + 1;
  $myTimestamp = strtotime("$years/$month/01"); //makes a date like 2009/12/01, and translate it to a timestamp
  return $myTimestamp;
}

Начинается со следующего for -loop:

for ($i = GetMonthsFromDate($StartDate); $i <= GetMonthsFromDate($StopDate); $i++)
{
    echo(date('d M Y',GetDateFromMonths($i))."</br>");
}

Который дал желаемый результат. Имеют ли смысл мои замечания?


Примечания:

(1) Я даже не думаю, что date существует как тип в PHP , но я могу ошибаться.

(2) Январь 1, февраль 2, ... ноябрь 11, но декабрь 0 . Это не даст желаемого результата.

0 голосов
/ 19 сентября 2009

Ваша логика прекрасно работает, чтобы получить список месяцев. Но не уверен, как мы можем справиться с годами в этом случае.

Вот мой код:

$startMonth= $_POST['startmonth'];

$startyear= $_POST['startyear'];

$endMonth= $_POST['endmonth'];

$endyear= $_POST['endyear'];

$sql = "SELECT PERIOD_DIFF(".$endyear.$endMonth.", ".$startyear.$startMonth.")";

$queryRS =  $db->query($sql);

$tmonthsarray = $db->fetchRow($c_jobsVat);

$totalmonths= $tmonthsarray[0]; 

for($count=$startMonth; $count <= ($startMonth + $totalmonths);$count++)
{
    echo "<BR>==>".date('F', mktime(0,0,0,$count)) ; // Months

    // what comes here in case of listing year
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...