2012-04-11 78 views
0

我正在研究需要檢查首次啓動日期的時差的項目。我正在使用NSDayCalendarUnit和NSWeekCalendarUnit。基本上,在每隔一天的第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 1 & 2, Week 1 - State 8 
Day 3 & 4, Week 1 - State 9 

我哪裏會想到這將是

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. 
... 

所以,如果你的例子是正確的,計算是不同的。

基於一個更簡單的例子,我會計算自第一次約會以來的時間間隔,然後除以兩天的時間長度,發言。這是該州:

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周,第0天)。 – Peter 2012-04-11 12:22:47

+0

因此,不要如圖所示執行表查找,請首先檢查商是否大於13;如果是,則將其設置爲14,然後執行表查找(表中爲第14個元素,值爲9)。 – DRVic 2012-04-11 12:26:31

+0

啊,我明白了!哇謝謝你的幫助。更好的代碼 - 有沒有辦法讓我測試一下,而不必等待幾天? – Peter 2012-04-11 12:47:42