【问题标题】:php loop through dates not exceeding month ending date [duplicate]php循环遍历不超过月底日期的日期[重复]
【发布时间】:2013-09-21 11:25:03
【问题描述】:

下面是我的脚本,它适用于除 29,30 和 31 之外的所有开始日期。任何人都可以让它适用于从 1....31 开始的所有日期,它应该按月递增并且不超过最后一个日期?

  $startdate='2010-01-30';
  $enddate='2011-01-30';
    while ($startdate <= $enddate)
     { 
      echo date('Y-m-d', $startdate ) . "\n";
      $startdate = strtotime('+1 month', $startdate);
    }

【问题讨论】:

  • 这很明显,因为 2 月没有 31 日。
  • @Yogesh 当然很明显。给他解决方法,而不是投反对票。
  • @JanDoggen:当没有提供他想要的东西时,很难解决。我们可以猜测他想要每个月的最后一天,但不确定那是他想要的。
  • @JanDoggen 我没有对他投反对票 :) 也许其他人已经这样做了。
  • 对不起,我假设太多了。 @Asad 你想完成什么?

标签: php date datetime


【解决方案1】:

试试这个

<?php
  $startdate='2010-01-31';
  $enddate='2011-01-31';
    $timestamp=  strtotime($startdate);
    while ($startdate <= $enddate)
     { 
      $startdate = date('Y-m-t', $timestamp);
      echo $startdate . "<br/>";
      $timestamp = strtotime('+1 days', strtotime($startdate));
    }
?>

【讨论】:

    【解决方案2】:

    试试

    <?php
        $startdate = strtotime('2010-01-29');
        $enddate = strtotime('2011-01-31');
    $inc = 1;
        while($startdate <= $enddate )
        {
            $date = date("t", $startdate);
            $numbersofdays = date('d',$startdate);
            $incDate = ($date - $numbersofdays) + 1;
            if ($startdate == $enddate || $inc==1) {
                echo date('Y-m-d',$startdate).  PHP_EOL;
            } else {
            echo date('Y-m-t',$startdate).  PHP_EOL;
           }
    
             $startdate = strtotime("+".$incDate." days", $startdate );
            $inc++;
        }
    ?>
    

    【讨论】:

    • 这段代码只是给出了错误的输出这是问题陈述我需要解决它亲爱的
    • @AsadKayani:开始日期需要 31 或者您可以选择任何日期?
    • @ratneshdwivedi 先生,它必须以 29,30 和 31 运行,它的必须休息日期 (1-28) 没问题。请让它运行 29,30
    • @AsadKayani:试试这个
    • @ratneshdwivedi 上面的代码在 28、29、30 日期不运行如何处理?
    【解决方案3】:

    这看起来像复杂的代码,但我相信这是您需要的。

    <?php
    $startDate='2010-01-29';
    $endDate='2013-12-30';
    $startDateSplit = explode("-",$startDate);
    $endDateSplit = explode("-",$endDate);
    $starTime = mktime(0, 0, 0, $startDateSplit[1], $startDateSplit[2], $startDateSplit[0]);
    $numDaysStart = $startDateSplit[2];
    $passThroughDelta = false;
    $endTime = mktime(0, 0, 0, $endDateSplit[1], $endDateSplit[2], $endDateSplit[0]);
    while ($starTime <= $endTime)
    {
          $startDate = date('Y-m-d', $starTime);
          echo $startDate . "\n";
          $startDateSplit = explode("-",$startDate);
          $numDays = cal_days_in_month(CAL_GREGORIAN, $startDateSplit[1],$startDateSplit[0]);
          echo $numDays . "\n";
          if($startDateSplit[1] == 12) {
             $startDateSplit[1] = 0;
             $startDateSplit[0]++;
          }
          if($numDaysStart > cal_days_in_month(CAL_GREGORIAN,     $startDateSplit[1]+1,$startDateSplit[0])) {
           $delta = $numDaysStart - cal_days_in_month(CAL_GREGORIAN,     $startDateSplit[1]+1,$startDateSplit[0]);
               $numDays = $numDays - $delta;
               $passThroughDelta = true;
          }
          else if ($passThroughDelta) {
               $numDays = $numDays + $delta;
               $passThroughDelta = false;
          }
          $starTime = mktime(0, 0, 0, $startDateSplit[1], $startDateSplit[2]+$numDays,     $startDateSplit[0]);
    }
    

    【讨论】:

    • 如果 $startDate='2010-01-30'; 你的代码会给出错误的输出; $endDate='2013-12-30';请帮助我编写正确运行日期为 28、29、30 和 31 的脚本。
    • 嗨 Asad,在这段代码中,我试图在 startDate 旁边添加月份中的天数,请参见这一行,$numDays = cal_days_in_month(CAL_GREGORIAN, $startDateSplit[1]+1, $startDateSplit[0]); ...我已尝试使用您在此脚本中提供的日期。我得到的输出为 2010-01-30 28 2010-02-27 31 2010-03-30 等等。你能告诉我错误在哪里吗?这样我就可以尝试更多。
    • 我想给出一个月 1,2,3,.....31st 之间的任何日期,它应该在下一个日期运行,就像我通过 $startdate="2010-02-28 " 它应该输出 2010-01-28 2010-02-28 2010-03-28 uptil last date ,对于像 $startdate="2010-01-29" 这样的情况,预期输出 2010-01-29 2010-02-28 2010 -03-29 以此类推...
    • 我已经编辑了我的代码以根据您的要求进行调整,请查看它是否适合您。我已经用以下日期测试了代码 $startdate="2010-02-28" , $startdate="2010-02-29" .. 它对我来说很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    相关资源
    最近更新 更多