PHP中两个日期之间所有月份和年份的列表

时间:2009-09-19 18:27:05

标签: php mysql date

我试图解释细节,以便这很容易理解。

我想根据月份和年份的差异列出月份和年份。

我正在实施基于开始月份的搜索功能,包括年份和年末月份。 原来如此!

开始选择 - 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 个答案:

答案 0 :(得分:9)

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:试图发表评论但是格式化已经搞砸了。 (当然,这些功能可以重写为一个内容,但希望更具可读性)

答案 1 :(得分:8)

您需要编写一些函数将日期转换为自特定日期和之后的几个月。例如,自1980年1月以来。

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

然后你只需做一个简单的“for”循环:

for ($i = GetMonthsFromDate($StartDate), $i <= GetMonthsFromDate($StopDate), $i++) {
   echo(GetDateFromMonths($i));
}

答案 2 :(得分:8)

虽然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');
}

再次列出月份

答案 3 :(得分:2)

这是最后的答案非常好

$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));
         }

答案 4 :(得分:1)

我根据你们的意见写了这个功能。看看这个:

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;
    }
}

答案 5 :(得分:0)

您的逻辑非常适合获取月份列表。但不确定在这种情况下我们如何处理多年。

这是我的代码:

$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
}

答案 6 :(得分:0)

我绝对同意@FractalizeR的解决方案和@elviejo的补充,它帮助我前进。但是我相信我遇到了一些问题,他们可能会帮助别人:(如果我错了,请纠正我)

  1. 需要注意的重点: $StartDate$StopDate都属于timestamp类型,实际上不是date - 类型(1 )。所以我将函数参数更改为$myTimestamp,希望不要混淆其他人。
  2. 例如:

    $StartDate = strtotime("Sept 2010");
    $StopDate = time(); // current timestamp
    
    1. 对于@elviejo的功能:
      1. 类型转换:简单的(int)对我不起作用(PHP5),所以我使用intval()代替
      2. 使用%给出的结果范围为0到11,而月份的范围为1到12 (2)。因此,在函数GetDateFromMonths($months)中,我们必须+1结果
      3. 因为我们在函数%中向GetDateFromMonths($months)添加1,所以我们必须从函数$dateAsMonths中的GetMonthsFromDate($myTimestamp)中减去1。
    2. 这给了我以下代码:

      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启动 - 循环:

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

      哪个给了想要的结果。我的言论有意义吗?


      注意:

      (1)我甚至认为date不存在type in PHP,但我可能错了。

      (2) 1月是1月,2月是2月,... 11月是11月,但12月是 0 。这不会给出想要的结果。