2011-09-16 6 views
1

私は学期の始まりの正確な日付を計算するために小さなクラスの組み合わせを構築しています。学期の始まりを決定するための規則は次のようになります:動的な日付の定義と条件

The monday of week number ## and after dd-mm-yyyy date 

ie: for winter its week number 2 and it must be after the january 8th of that year 

私はすべての学期(合計4)のために、これらのデータが含まれているリソースクラスを構築しています。しかし今、私はpublic holidaysに基づく問題に直面しています。それらのいくつかは月曜日にあるかもしれないので、その場合は火曜日の日付を取得する必要があります。

私は現在働いている問題は以下の通りです:

The target semester begins on or after august 30 and must be on week 35. 

私はまた、9月の最初の月曜日に起こる祝日を考慮しなければなりません。 PHPの用語で

条件は、条件として「単語」これに最善の方法であることと、配列に格納しますどのような次

if (date('m', myDate) == 9 // if the month is september 
    && date('w', myDate) == 1 // if the day of the week is monday 
    && date('d', myDate) < 7 // if we are in the first 7 days of september 
) 

のですか?

EDIT

私は日付がここでの問題ではありません発見、十分に明らかにされていない可能性があります。実際の問題は、次のような設定配列で条件を記憶している。

$_ressources = array(
    1 => array(
     'dateMin' => '08-01-%', 
     'weekNumber' => 2, 
     'name' => 'Winter', 
     'conditions' => array() 
    ), 
    2 => array(
     'dateMin' => '30-04-%', 
     'weekNumber' => 18, 
     'name' => 'Spring', 
     'conditions' => array() 
    ), 
    3 => array(
     'dateMin' => '02-07-%', 
     'weekNumber' => 27, 
     'name' => 'Summer', 
     'conditions' => array() 
    ), 
    4 => array(
     'dateMin' => '30-08-%', 
     'weekNumber' => 35, 
     'name' => 'Autumn', 
     'conditions' => array("date('m', %date%) == 9 && date('w', %date%) == 1 && date('d', %date%) < 7") 
    ) 
); 

私はそれが今提示の道を持っている問題は、私はどの私はむしろだろう、eval()機能を使用する必要がありますということですではない。

+0

私は質問へのあなたのアップデートに従って私の答えを更新しました。あなたの問題を解決しますか? – danishgoel

答えて

1

あなたは言った:

ターゲット学期は8月30日以降に開始され、その場合は週35

上にある必要がありますすることができます週番号のための簡単なチェック。

if(date('W', myDate) == 35) 

またはあなたの試験条件が正しければ、それはif文で、その後1

if((date('m', myDate) == 9 // september 
    && date('w', myDate) == 1 // monday 
    && date('d', myDate) <= 7 // first 7 days of september 
) 

から始まり、としてあなたはどの希望月曜日見つけたら、あなたは、7までの日数を比較する必要がありますそのない祝日、ここでは、この

if(...){ 
    while(!array_search (myDate, aray_of_public_holidays)) 
     date_add($myDate, date_interval_create_from_date_string('1 days')); 
} 

を行うarray_of_public_holidaysが祝日のリストが含まれている場合はOKなります。コード
次のコードで

アップデートは
次のコードは、ニーズのために働く必要があります更新質問に応じて、あなたの目的に

<?php 
    // array with public holidays 
    $public_holidays = array(/* public holidays */); 

    // start on 30th august 
    $myDate = new DateTime('August 30'); 

    // loop till week number does not cross 35 
    while($myDate->format('W') <= 35){ 
     // if its a monday 
     if($myDate->format('w') == 1){ 
      // find the next date not a public holiday 
      while(array_search($myDate, $public_holidays)) 
       $myDate->add(date_interval_create_from_date_string('1 days')); 

      // now myDate stores the valid semester start date so exit loop 
      break; 
     } 
     // next date 
     $myDate->add(date_interval_create_from_date_string('1 days')); 
    } 

    // now myDate is the semester start date 
?> 

アップデートを動作するはずです。条件をPHPコードとして配列に格納する必要はありません。次のコードは、それを行う方法を示しています

// semester conditions 
$sem_conditions = array(
    1 => array(
     'dateMin' => '08-01-%', 
     'weekNumber' => 2, 
     'name' => 'Winter' 
    ), 
    2 => array(
     'dateMin' => '30-04-%', 
     'weekNumber' => 18, 
     'name' => 'Spring' 
    ), 
    3 => array(
     'dateMin' => '02-07-%', 
     'weekNumber' => 27, 
     'name' => 'Summer' 
    ), 
    4 => array(
     'dateMin' => '30-08-%', 
     'weekNumber' => 35, 
     'name' => 'Autumn' 
    ) 
); 

// array with public holidays format (d-M) 
$public_holidays = array('05-09', '10-01'); 

// store sem starts 
$sem_starts = array(); 

// for each semester 
foreach($sem_conditions as $sem){ 
    // start date 
    $myDate = date_create_from_format('d-m', substr($sem['dateMin'], 0, -2)); 

    // loop till week number does not cross $sem['weekNumber'] 
    while($myDate->format('W') <= $sem['weekNumber']){ 
     // if its a monday 
     if($myDate->format('w') == 1){ 
      // find the next date not a public holiday 
      while(array_search($myDate->format('d-m'), $public_holidays) !== false) 
       $myDate->add(date_interval_create_from_date_string('1 days')); 

      // now myDate stores the valid semester start date so exit loop 
      break; 
     } 
     // next date 
     $myDate->add(date_interval_create_from_date_string('1 days')); 
    } 

    // add to sem starts 
    $sem_start[$sem['name']] = $myDate->format('d-m-Y'); 
} 

var_dump($sem_start); 
+0

クリスマスや新年のような静的休日の場合は、これは魅力的なように機能しますが、可変日付の休日の場合は機能しません。私の例では、休日の日付は次のように決定されます:9月の最初の月曜日(月の最初の7日のいずれか)。それは私が覚えて、次に日付を見つけるために実行するために必要な式のようなものです。 –

+0

@Jeffあなたは休日が条件(9月の最初の月曜日)を満たす日付であることを意味しますか?あなたが事前に日付を手で見つけてXMLファイルに入れることが可能な場合は、日付を格納できるXMLファイルから祝祭日リストを入力するか、評価条件を格納することができます。 – danishgoel

1

ターゲット学期は学期の開始は、週35と8月30日の間に、最小限の日付である8月30日以降に開始し、週35

上にある必要があります:

$week35 = new DateTime("January 1 + 35 weeks"); 
$august30 = new DateTime("August 30"); 

$start = min($week35, $august30); 

また:

$start = min(date_create("January 1 + 52 weeks"), date_create("August 30"));