2016-11-14 27 views
1

年と週の番号を渡すときに開始日と終了日を取得するプログラムがあります。以下はコードです。開始日と終了日を月の始まりと終わりの月末に取得する

function getStartAndEndDate($week, $year) { 
    $dto = new DateTime(); 
    $dto->setISODate($year, $week,0); 
    $ret['week_start'] = $dto->format('Y-m-d'); 
    $dto->modify('+6 days'); 
    $ret['week_end'] = $dto->format('Y-m-d'); 
    return $ret; 
} 

$week_array = getStartAndEndDate(5,2017); 
print_r($week_array); 

Array ([week_start] => 2017-01-29 [week_end] => 2017-02-04) 

としてこの意志の出力結果でも、私は2つの部分で週を取得する必要があります。たとえば、結果は次のようになります。

Array ([week_start] => 2017-01-29 [week_end] => 2017-01-31) 
Array ([week_start] => 2017-02-01 [week_end] => 2017-02-04) 

これは別の月に別々の値が必要であることを意味します。どんな助けもありがとう。

+0

はどのように '2 days' –

+0

内の'週間ends'は実際に週が終了していないことができます。私が必要とするのは、日付が異なる月にある場合、同じ週を2つに分割することです。 – Thejas

答えて

3

月を2つ比較し、't'形式を使用して、その月の最終日を後で取得します。使用可能なすべてのフォーマットと以下の例の詳細については、description of date() functionに従ってください。

また、実際に変更可能なバージョンが必要な場合を除き、DateTimeの代わりにDateTimeImmutableを使用する方が良いです。

function getStartAndEndDate($week, $year) 
{ 
    $dto = (new DateTimeImmutable())->setISODate($year, $week, 0); 
    $weekStart = $dto; 
    $weekEnd = $dto->modify('+6 days'); 

    $ret = []; 
    if ($weekStart->format('m') === $weekEnd->format('m')) { 
     $ret[] = [ 
      'week_start' => $weekStart, 
      'week_end' => $weekEnd, 
     ]; 
    } else { 
     $ret[] = [ 
      'week_start' => $weekStart->format('Y-m-d'), 
      // 't' = the last day of the month. 
      'week_end' => $weekStart->format('Y-m-t'), 
     ]; 

     $ret[] = [ 
      // The first day of the month. 
      'week_start' => $weekEnd->format('Y-m-01'), 
      'week_end' => $weekEnd->format('Y-m-d'), 
     ]; 
    } 

    return $ret; 
} 
関連する問題