0

指定された2つの日付の間の年と月のリストを取得したい

これが私のコードです

    function yearMonth($start_date, $end_date)  
    {  

        $years = array();
        $base  = 0 ;
        while(($start_date) < $end_date)
        {

                $y           = date('Y' , $start_date);
                // if its the original start_time check the month from 
                //current date else get the first day and month in that year
                $base        = ($base == 0 )  ? $start_date : strtotime("{$y}-1-1"); 

                for($i = 1 ; $i <= 12 ; $i++ )
                {
                   if($base > $end_date)
                   break;
                   $years[date("Y", $start_date)][] = date("F" , $base); 
                   $base += 2629743.83;

                }

               $base += $start_date += 31556926 ;


        }
        return $years;

    }  

    $list  =  yearMonth(strtotime("2010-11-8") , strtotime("2012-11-11") );  
    var_dump($list);

だからここに問題があります

$base     = ($base == 0 )  ? $start_date : strtotime("{$y}-1-1"); 

ここでstart_dateは、関数に渡したオリジナルであるかどうかを確認します。その年の月を見つけるためのベースをstart_dateに設定し、オリジナルでない場合は、ベースをその年の最初の月に設定します。

今、私たちは私の問題に到達します

for($i = 1 ; $i <= 12 ; $i++ )

ここでは、その年に12か月あると想定していますが、元のstart_dateの場合は、それより少なくなる可能性があります。

特定の日付の年の残りの月を計算するにはどうすればよいですか?

別の問題はここにあります

            for($i = 1 ; $i <= 12 ; $i++ )
            {
                   if($base > $end_date)
                   break;
                   $years[date("Y", $start_date)][] = date("F" , $base); 
                   $base += 2629743.83;

            }

毎月2629743.83秒だと思いますが、うるう年のせいであまり正確ではありません。

これを行うためのよりクリーンな方法はありますか?

4

1 に答える 1

2

既存のコードを変更するか、PHPの組み込みのDateTimeクラスを使用するかの2つの解決策があります。

コード内の2つのことを修正したいとします。

  • 開始年の残りの月のみを一覧表示します。これを行うには、$base日付が出力する年にあることを確認するチェックを追加します。
  • 各年の配列で正しい月を取得します。これを行うには$base、各月の正しい日数をインクリメントします。を使用して、その月の日数を取得できますdate('t')
for($i = 1 ; $i <= 12 ; $i++ )
{
   if($base > $end_date)
   break;
   $base_year = date('Y', $base);
   if ($base_year == $y) {
    $years[date("Y", $start_date)][] = date("F" , $base); 
    $base += 60*60*24*date('t', strtotime($base_year.'-'.$i."-1")); 
   }
}

または、DateTimeオブジェクトを使用してコードを簡略化することもできます。この例は、DatePeriodへのコメントの一部のコードに基づいています。

注:関数の引数には、で解析された日付は必要ありませんstrtotime

function yearMonth($start_date, $end_date) 
{

    $begin = new DateTime( $start_date );
    $end = new DateTime( $end_date);
    $interval = new DateInterval('P1M'); // 1 month interval

    $period = new DatePeriod($begin, $interval, $end);

    foreach ( $period as $dt )
        $years[$dt->format( "Y" )][] = $dt->format( "F" );

    return $years;

}

$list  =  yearMonth("2010-11-8", "2012-11-11");  
var_dump($list);
于 2012-08-14T06:08:44.943 に答える