NSDate单位和计算

时间:2012-04-11 11:48:20

标签: iphone objective-c ios

我正在开发一个需要检查第一个发布日期的时差的项目。我正在使用NSDayCalendarUnit和NSWeekCalendarUnit。基本上每隔一天我会想要执行一些事情。我正在使用的对象需要每两天一次处于某种状态。

所以例如

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
    }

旁注:我知道这是错误的代码,我打算用开关案例替换它,我只需要先对逻辑进行排序。

我的问题是有更好的方法来计算这种模式吗?

1 个答案:

答案 0 :(得分:0)

我说你的目标并不完全清楚:

  

在第二天的前两周,我想做点什么。

     

所以例如

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 ) ];