代码之家  ›  专栏  ›  技术社区  ›  santosh

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

  •  4
  • santosh  · 技术社区  · 16 年前

    我试图解释细节,以便易于理解。

    我想要一份基于月份和年份差异的月份和年份列表。

    我正在实施基于起始月份和结束月份的搜索功能。 所以

    开始选择-01(月)-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 回复  |  直到 13 年前
        1
  •  9
  •   Jamshid Hashimi    14 年前

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

    (当然,这些函数可以重写为一行程序,但希望更具可读性)

        2
  •  8
  •   Vladislav Rastrusny    16 年前

    您需要编写一些函数来将日期转换为从某个日期起经过的月份数。例如,自1980年1月以来。

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

    然后您只需执行简单的“for”循环:

    for ($i = GetMonthsFromDate($StartDate), $i <= GetMonthsFromDate($StopDate), $i++) {
       echo(GetDateFromMonths($i));
    }
    
        3
  •  8
  •   elviejo79    16 年前

    虽然FractalizeR的答案是正确的。 还有另一种选择。

    利用strotime(“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');
    }
    

    又是一份月份清单

        4
  •  2
  •   santosh    16 年前

    这是最后的答案,非常有效

    $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));
             }
    
        5
  •  1
  •   BenMorel Manish Pradhan    12 年前

    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;
        }
    }
    
        6
  •  0
  •   BenMorel Manish Pradhan    12 年前

    你的逻辑很好,可以得到一个月的清单。但我不知道在这种情况下我们如何处理这些年。

    这是我的密码:

    $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
    }
    
        7
  •  0
  •   Wim pnezis    11 年前

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

    1. 需要注意的重要事项: 二者都 $StartDate $StopDate timestamp ,实际上不是 date (1) $myTimestamp 希望不要把别人搞糊涂。

    例如:

    $StartDate = strtotime("Sept 2010");
    $StopDate = time(); // current timestamp
    
    1. 对于@elviejo的功能:
      1. (int) 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

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

    这就得到了想要的结果。我的话有意义吗?


    笔记:

    (1) 我甚至不认为 日期 作为一个整体存在 type in PHP ,但我可能错了。

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