【问题标题】:How to find the dates between two specified date?如何找到两个指定日期之间的日期?
【发布时间】:2011-02-13 18:33:26
【问题描述】:

如果我有两个日期 20-4-2010 和 22-4-2010 在两个文本框中和 我希望日期是这样的 20, 21, 22。我如何得到它?

【问题讨论】:

    标签: php


    【解决方案1】:
    /**
    * Function to list of weeks start and end.
    * @param string strDateFrom  (Date From "YYYY-MM-DD")
    * @param string strDateTo  (Date To "YYYY-MM-DD")
    * @return array weeks
    */
    function getWeeksBetweenTowDates($date_from, $date_to) {
        $startweek = $current_week = date("W", strtotime($date_from));
        $endweek = date("W", strtotime($date_to));
        $current_year = date("Y", strtotime($date_from));
        $current_yearweek = date("Y", strtotime($date_from)) . $startweek;
        $end_yearweek = date("Y", strtotime($date_to)) . $endweek;
        $start_day = 0;
        $end_day = 0;
        while ($current_yearweek <= $end_yearweek) {
            $dto = new DateTime();
            if ($start_day == 0) {
            $start_day = $dto->setISODate(date("Y", strtotime($date_from)), $current_week, 0)->format('Y-m-d');
            $end_day = $dto->setISODate(date("Y", strtotime($date_from)), $current_week, 6)->format('Y-m-d');
            } else {
            $start_day = $dto->setISODate(date("Y", strtotime($end_day)), $current_week, 0)->format('Y-m-d');
            $end_day = $dto->setISODate(date("Y", strtotime($end_day)), $current_week, 6)->format('Y-m-d');
            }
    
            $arr_weeks[sprintf("%02d", $current_week)] = $start_day . " =>" . $end_day;
            $last_yearweek_in_year = $current_year . date("W", strtotime('31-12-' . $current_year));
    
            if ($current_yearweek == $last_yearweek_in_year) {      //last week in the year
            $current_week = 1;
            $current_year = ($current_year + 1);
            } else {
            $current_week = ($current_week + 1);
            }
            $current_yearweek = $current_year . sprintf("%02d", $current_week);
        }
        return $arr_weeks;
    }
    

    运行方式: date_from=2015-10-20 , date_to=2016-04-15

    $arr_weeks = $this->getWeeksBetweenTowDates($date_from, $date_to);
    

    输出:

        Array
    (
        [43] => 2015-10-18 =>2015-10-24
        [44] => 2015-10-25 =>2015-10-31
        [45] => 2015-11-01 =>2015-11-07
        [46] => 2015-11-08 =>2015-11-14
        [47] => 2015-11-15 =>2015-11-21
        [48] => 2015-11-22 =>2015-11-28
        [49] => 2015-11-29 =>2015-12-05
        [50] => 2015-12-06 =>2015-12-12
        [51] => 2015-12-13 =>2015-12-19
        [52] => 2015-12-20 =>2015-12-26
        [53] => 2015-12-27 =>2016-01-02
        [01] => 2016-01-03 =>2016-01-09
        [02] => 2016-01-10 =>2016-01-16
        [03] => 2016-01-17 =>2016-01-23
        [04] => 2016-01-24 =>2016-01-30
        [05] => 2016-01-31 =>2016-02-06
        [06] => 2016-02-07 =>2016-02-13
        [07] => 2016-02-14 =>2016-02-20
        [08] => 2016-02-21 =>2016-02-27
        [09] => 2016-02-28 =>2016-03-05
        [10] => 2016-03-06 =>2016-03-12
        [11] => 2016-03-13 =>2016-03-19
        [12] => 2016-03-20 =>2016-03-26
        [13] => 2016-03-27 =>2016-04-02
        [14] => 2016-04-03 =>2016-04-09
        [15] => 2016-04-10 =>2016-04-16
    )
    

    【讨论】:

      【解决方案2】:

      试试这个,希望对你有帮助

      $begin = date("Y-m-d", strtotime($date);
      $end = date("Y-m-d", strtotime($date));
      $begin = new DateTime($begin);
      $end = new DateTime($end);
      
      for ($i = $begin; $i <= $end; $i=$i->modify('+1 day')) {
          echo $i->format('Y-m-d');
      }
      

      【讨论】:

        【解决方案3】:

        我很确定这个问题已经被回答过千万次了,但无论如何:

        $start = strtotime('20-04-2010 10:00');
        $end   = strtotime('22-04-2010 10:00');
        for($current = $start; $current <= $end; $current += 86400) {
            echo date('d-m-Y', $current);
        }
        

        10:00 部分是为了防止代码由于夏令时而跳过或重复一天。

        通过给出天数:

        for($i = 0; $i <= 2; $i++) {
            echo date('d-m-Y', strtotime("20-04-2010 +$i days"));
        }
        

        使用 PHP5.3

        $period = new DatePeriod(
            new DateTime('20-04-2010'),
            DateInterval::createFromDateString('+1 day'),
            new DateTime('23-04-2010') // or pass in just the no of days: 2
        );
        
        foreach ( $period as $dt ) {
          echo $dt->format( 'd-m-Y' );
        }
        

        【讨论】:

        • +1 表示 Date* 类,-1 表示“花哨”和“矫枉过正”,+1 表示给出除经常引用的 strtotime 解决方案之外的其他内容。 :)
        • @gordon 你能解释一下为什么在那里设置上午 10:00 时间可以让他们适当地考虑 DST 吗?关于我问的原因,请参阅:stackoverflow.com/questions/15302469/…
        • @戈登啊哈。我明白了,非常感谢,让我头疼不已 =)。
        • @Shackrock 不客气。请注意,它不必特别是 10:00。它不应该是在应用或删除 DST 后会导致一天变化的时间。
        • @gordon 是的,很好的澄清。我做了一些测试,我在旧代码中使用的通常是一天的开始或一天的结束,所以在这两种情况下我都浪费了一天!
        【解决方案4】:

        您可以使用mktime()

        mktime() 对于进行日期运算和验证很有用,因为它会自动为超出范围的输入计算正确的值。

        如果您增加天数,您会得到一个有效的日期,即使您超过了月底:

        <?php
        $day= 25;
        $dateEnd = mktime(0,0,0,5,3,2010);
        do {
            $dateCur = mktime(0,0,0,4,$day,2010);
            $day++;
            print date( 'd-m-y', $dateCur) .'<br>';
        } while ($dateCur < $dateEnd);
        

        输出:

        25-04-10
        26-04-10
        27-04-10
        28-04-10
        29-04-10
        30-04-10
        01-05-10
        02-05-10
        03-05-10
        

        【讨论】:

          【解决方案5】:

          你可以这样做:

          $start = strtotime("2010-04-20"); // get timestamp for start date.
          $end = strtotime("2010-04-22");   // get timestamp for end date.
          
          // go from start timestamp to end timestamp adding # of sec in a day.
          for($t=$start;$t<=$end;$t+=86400) {
                  // get the date for this timestamp.
                  $d = getdate($t);
          
                  // print the date.
                  echo $d['mday'].'-'.$d['mon'].'-'.$d['year']."\n";
          }
          

          输出:

          20-4-2010
          21-4-2010
          22-4-2010
          

          【讨论】:

            猜你喜欢
            • 2017-04-22
            • 1970-01-01
            • 2011-12-13
            • 2020-07-19
            • 2013-02-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多