1

私は2つの日付を持っています

$st_date = '2012-07-20';
$ed_date = '2012-07-27';

$st_dateからAsまでのすべての日付を表示したい$ed_date :

2012-07-20
2012-07-21
2012-07-22
2012-07-23
2012-07-24
2012-07-25
2012-07-26
2012-07-27

まず count の違いを考えて、foreach < count を実行し、$i day を $st_date に追加します。
しかし、ループはしたくありません。コードが増えます。すべての日付の配列を返す direct date() のいずれか。

4

6 に答える 6

3

このコードを試してください:

<?php
$st_date = '2012-07-20';
$ed_date = '2012-07-27';

$dateMonthYearArr = array();
$st_dateTS = strtotime($st_date);
$ed_dateTS = strtotime($ed_date);

for ($currentDateTS = $st_dateTS; $currentDateTS <= $ed_dateTS; $currentDateTS += (60 * 60 * 24)) {
// use date() and $currentDateTS to format the dates in between
$currentDateStr = date(“Y-m-d”,$currentDateTS);
$dateMonthYearArr[] = $currentDateStr;
//print $currentDateStr.”&lt;br />”;
}

echo  “&lt;pre>”;
print_r($dateMonthYearArr);
echo “&lt;/pre>”;
?>
于 2012-07-19T08:11:36.450 に答える
3

ループに対するあなたの嫌悪感は理解できませんが、コードをできるだけ隠していることは理解しています。

そのために、PHP のDateTimeオブジェクトを拡張して、必要な機能を提供します。このようなもの:-

class MyDateTime extends DateTime
{
    /**
    * Creates an array of date strings of all days between
    * the current date object and $endDate
    * 
    * @param DateTime $endDate
    * @return array of date strings
    */
    public function rangeOfDates(DateTime $endDate)
    {
        $result = array();
        $interval = new DateInterval('P1D');
        //Add a day as iterating over the DatePeriod
        //misses the last day for some strange reason
        //See here http://www.php.net/manual/en/class.dateperiod.php#102629
        $endDate->add($interval); 
        $period = new DatePeriod($this, $interval, $endDate);
        foreach($period as $day){
            $result[] = $day->format('Y-m-j');
        }
        return $result;
    }
}

次に、それを使用したいときに、これを行うことができます:-

$st_date = new MyDateTime("2012-07-20");
$en_date = new DateTime("2012-07-27");
$dates = $st_date->rangeOfDates($en_date);
var_dump($dates);

次の出力が得られます:-

array
  0 => string '2012-07-20' (length=10)
  1 => string '2012-07-21' (length=10)
  2 => string '2012-07-22' (length=10)
  3 => string '2012-07-23' (length=10)
  4 => string '2012-07-24' (length=10)
  5 => string '2012-07-25' (length=10)
  6 => string '2012-07-26' (length=10)
  7 => string '2012-07-27' (length=10)

残念ながら、おそらくその配列を反復処理するにはループが必要になるでしょう:)

明らかに、このソリューションは目的を達成するためにループを使用しますが、ループは再利用可能な優れたコードにカプセル化されています。

詳細については、 DateTimeDateInterval、およびDatePeriodに関する PHP マニュアルを参照してください。それらのページへのコメントには多くのヒントがあります。

于 2012-07-19T09:20:42.623 に答える
2
$start = strtotime('2009-02-01'); 
$end = strtotime('2009-03-10'); 
$range = array();

$date = strtotime("-1 day", $start);  
while($date < $end)  { 
   $date = strtotime("+1 day", $date);
   $range[] = date('Y-m-d', $date);
} 
于 2012-07-19T08:06:54.437 に答える
2

range() & array_map() を使用したループなし:

編集: 1 日 = 86400 秒であるため、86400 にジャンプする必要があるため、コードは問題ないはずです :)

    $st_date = '2012-07-20';
    $ed_date = '2012-07-27';
    $dates = range(strtotime($st_date), strtotime($ed_date),86400);
    $range_of_dates = array_map("toDate", $dates);
    print_r($range_of_dates);
    function toDate($x){return date('Y-m-d', $x);}

?>
于 2012-07-19T09:50:49.750 に答える
1
$st_date = '2012-07-20';
$ed_date = '2012-07-27';

for($i=$st_date;$i<=$ed_date;$i++)echo $i."<br />";
于 2012-07-19T08:02:58.313 に答える
0

パーティーに少し遅れましたが、以前にこの問題に取り組み、次のようにしました。これは、ここの他の例よりもクリーンであるため、人々のオプションとして追加します;

function dateRange($from, $to)
{
    return array_map(function($arg) {
         return date('Y-m-d', $arg);
    }, range(strtotime($from), strtotime($to), 86400));
}

使用法:

$dates = dateRange('2017-01-01', '2017-01-08');

戻り値:

Array
(
    [0] => 2017-01-01
    [1] => 2017-01-02
    [2] => 2017-01-03
    [3] => 2017-01-04
    [4] => 2017-01-05
    [5] => 2017-01-06
    [6] => 2017-01-07
    [7] => 2017-01-08
)
于 2017-08-02T15:10:12.573 に答える