2011-06-25 14 views
5

私はこのことについてどうやって行くのか分かりません。私はPHPでカレンダーを作成しており、次のルールに従った繰り返しイベントを追加できるようにする必要があります。月の最後の月曜日の見つけ方

最後の[DOW]月(最後の[Mon/Tues/Wed/etc]週)

私はルール自体が保存されている、私はちょうどPHPの月の最後の月曜日/水/水を推測するのに最善の方法がわからないのですか?私はこれがもっと複​​雑になっているようになりました。

$month=4の変数があるとしますと、$dow=3$year=2011私はこれをどうするのがベストでしょうか?

答えて

20

あなたは適切な英語で表現することができますが、数字を使って表現するのは苦労します。strtotimeはあなたの親友です。

echo strtotime("last Monday of June 2011"); 

これは、あなたが適切な、人間が読める日付を取得するためにdateの2番目のパラメータと同類として使用できるタイムスタンプを返します。これはC言語で書かれた組み込み関数なので、PHPで書かれたほとんどのものよりもはるかに高速です(現実のシナリオではあまり問題にならないでしょう)。

ですから$month=4$dow=3$year=2011を持っていると仮定すると、あなたはそれらのテキスト表現に配列マッピング$month彼らの英語のテキスト表現への値と別の配列マッピング$dow値が必要になります。

+2

ちょうどメモとして:あなたが忘れないようにします「of」。 – cwallenpoole

+0

そんなにありがとう!私はそれを複雑にしていたと思った! – TH1981

0

私は月のn番目の日を計算するための汎用関数を持っています。これがあなたの問題を解決するのに役立つことを願っています。

function get_Nth_dow($dow, $occurence, $m, $y) 
{ 
    $numdays = date('t', mktime(0, 0, 0, $m, 1, $y)); 
    $add = 7 * ($occurence - 1); 
    $firstdow = date('w', mktime(0, 0, 0, $m, 1, $y)); 
    $diff = $firstdow - $dow; 

    $day_of_month = 1; 
    if ($diff > 0) 
    { 
     $day_of_month += ($add - $diff); 
    } 
    elseif ($diff < $numdays) 
    { 
     $day_of_month -= ($diff - $add); 
    } 

    return $day_of_month; 
} 

$DOW =曜日(0 =日曜日、6 =土曜日)。

$X =出現(1 =最初、2 = 3番目など)。与えられた月が

ない場合、それは最後を返します。

は金曜日の第七発生を求める場合、それは月の最後の

金曜日を返します。 $M =月 $Y =年

例、get_Nth_DOW(2,3,7,2009)は第七2009年

0

の第三火曜日を返します。ここでの代替です:

<? 
function lastDayOfMonth($month, $year) { 
    switch ($month) { 
     case 2: 
      # if year is divisible by 4 and not divisible by 100 
      if (($year % 4 == 0) && ($year % 100) > 0) 
       return 29; 
      # or if year is divisible by 400 
      if ($year % 400 == 0) 
       return 29; 
      return 28; 
     case 4: 
     case 6: 
     case 9: 
     case 11: 
      return 30; 
     default: 
      return 31; 
    } 
} 

function lastDayOfWeek($month, $year, $dow) { 
    $d = new DateTime(); 

    #Finding the last day of month 
    $d = $d->setDate($year, $month, lastDayOfMonth($month, $year)); 

    #Getting the day of week of last day of month 
    $date_parts = getdate($d->getTimestamp()); 

    $diff = 0; 

    #if we can't find the $dow in this week... (cause it would lie on next month) 
    if ($dow > $date_parts['wday']) { 
     # ...we go back a week. 
     $diff -= 7; 
    } 

    return $date_parts['mday'] + $diff + ($dow - $date_parts['wday']); 
} 

# checking the algorithm for this month... 
for ($i=0; $i < 7; $i++) { 
    echo lastDayOfWeek(6,2011,$i) . "<br>"; 
} 

?> 
関連する問題