2012-04-11 14 views
0

私は、最初の開始日からの時間差を確認する必要があるプロジェクトに取り組んでいます。私はNSDayCalendarUnitとNSWeekCalendarUnitを使用しています。基本的に2日目の最初の2週間は何かをしたい。私が使用しているオブジェクトは、一度に2日ごとに特定の状態にある必要があります。NSDate単位と計算

だから例えばここで

Day 1 & 2, Week 0 - State 1 
Day 3 & 4, Week 0 - State 2 
... 
Day 1 & 2, Week 1 - State 8 
Day 3 & 4, Week 1 - State 9 

が私のコードです:

// get the data/time difference from the first launch 
    int daysDifferent = [[dateDifferenceInfo objectForKey:@"days"] intValue]; 
    int weeksDifferent = [[dateDifferenceInfo objectForKey:@"weeks"] intValue]; 

    if(daysDifferent == 2 | daysDifferent == 3 && !weeksDifferent && _dot.age != 2){ 
     // set state 
    } 

    if(daysDifferent == 4 | daysDifferent == 5 && !weeksDifferent && _dot.age != 3){ 
     // set state 
    } 
    if((daysDifferent == 6 && weeksDifferent == 0 | daysDifferent == 0 && weeksDifferent == 1) && _dot.age != 4){ 
     // set state 
    } 

    if(daysDifferent == 0 | daysDifferent == 1 && weeksDifferent == 1 && _dot.age != 5){ 
     // set state 
    } 

    if(daysDifferent == 2 | daysDifferent == 3 && weeksDifferent == 1 && _dot.age != 6){ 
     // set state 
    } 

    if(daysDifferent == 4| daysDifferent == 5 && weeksDifferent == 1 && _dot.age != 7){ 
     // set state 
    } 

    if((daysDifferent == 6 && weeksDifferent == 1 | daysDifferent == 0 && weeksDifferent == 2) && _dot.age != 8){ 
     // set state 
    } 

    if(weeksDifferent >= 2 && !(daysDifferent % 2)){ 
     // set state 
    } 

サイドノート:私はそれが悪いのコードを知っている、私はスイッチの例でこれを交換する予定で、私はちょうどソートロジックに必要最初。

私の質問は、このような種類のパターンを計算する良い方法はありますか?

答えて

0

あなたが言うように私は、あなたの目標に完全に明確ではないよ:

最初の2週間は、私が何かを実行したいすべての二日目。たとえば、私はそれはあなたの例が正しいのであれば、計算が異なる

Day 1 & 2, Week 0 - State 1 
Day 3 & 4, Week 0 - State 2 
Day 5 & 6, Week 0 - State 3 
Day 7 Week 0 & Day 1 Week 1 - State 4. 
... 

だろうと思っているだろう

Day 1 & 2, Week 0 - State 1 
Day 3 & 4, Week 0 - State 2 
... 
Day 1 & 2, Week 1 - State 8 
Day 3 & 4, Week 1 - State 9 

ためので

より単純な例に基づいて、最初の日付以降の時間間隔を計算し、1日の長さを床の長さの2倍で除算します。それは状態です:

NSDate *firstDate = ... 
NSDate *secondDate = ... 
NSTimeInterval interval = [ secondDate timeIntervalSinceDate: firstDate ]; 
double secondsPerDay = 60 * 60 * 24.0; // s per min times min per hr times hrs per dy. 
int state = (int) (interval/secondsPerDay * 0.5) + 1; 

一方で、それは本当にあなたが説明したように、私はのように迅速かつ簡単に使用するアプローチは、同様の計算を行うことであろうあり、場合 - で0.5倍を除外します最後の行は、その後、その日から状態を取得するには、簡単なテーブルルックアップを使用します。

int table[ 14 ] = { 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8 }; 
int state = table[ (int) (interval/secondsPerDay) ]; 
+0

おかげで、私はあなたが意味するが、最初の2週間後の状態が変化しない、それが最後に残っているものを参照してください既知の状態(2週目、0日目)。 – Peter

+0

このようにテーブルルックアップを行うのではなく、まず商が13より大きいかどうかを確認します。そうであれば、それを14に設定して、テーブルルックアップを実行します(テーブル内の14番目の要素、値9)。 – DRVic

+0

ああ私は見る!あなたの助けに感謝します。かなり良いコード - 私は日を待つことなくこれをテストする方法がありますか? – Peter

関連する問題