我正在开发一个需要检查第一个发布日期的时差的项目。我正在使用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
}
旁注:我知道这是错误的代码,我打算用开关案例替换它,我只需要先对逻辑进行排序。
我的问题是有更好的方法来计算这种模式吗?
答案 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 ) ];