保存された NSDate を取得し、それが現時点の時間、日、または週に含まれるかどうかを確実に判断する必要があります。私は解決策をハックしたようですが、以前にこの問題を解決したことがないため、信頼できるものであると完全に確信していません.
これは、ユーザーが設定した 12 時間対 24 時間に耐えられますか? 日付フォーマット ガイドは、このユーザー設定が予期しない日付の動作につながる可能性があることを示しています。
この問題の基本的なコード パターンはどうですか? このコードは確実にその目的を果たしているように見えますか? 「コードをチェックしてください」というような質問を投稿するのは嫌いですが、それは私にはなじみのない問題であり、厳密にテストするのに十分なほどトリッキーであり、正当に思われました. NSDateFormatter も比較的新しいものです。質問のもう一つの動機。
注: 私の緊張の主な原因は、日付を文字列に変換してから文字列を比較することは、この問題を解決するための本質的に脆弱な方法のように思われることです。しかし、それは私が思いつくことができる最高のものです。
クイック リファレンス: dateFormat
3 つのケースのそれぞれに使用した s は次のとおりです。
dateFormat = @"yyyyMMddHH"; // For "this hour" check
dateFormat = @"yyyyMMdd"; // For "today" check
dateFormat = @"yyyyww"; // For "this week" check
ありがとう!コードは次のとおりです。
- (BOOL)didThisCycle {
// Case 1: hourly; Case 2: daily; Case 3: weekly
BOOL did = NO;
NSDate *now = [NSDate date];
NSDate *lastDid = [self.didDates lastObject];
if (![lastDid isKindOfClass:[NSDate class]]) { // Crash protection
return NO;
}
int type = [self.goalType intValue];
switch (type) {
case 1:
{
// If hourly check hour
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
formatter.dateFormat = @"yyyyMMddHH";
NSString *nowString = [formatter stringFromDate:now];
NSString *lastDidString = [formatter stringFromDate:lastDid];
if ([nowString isEqualToString:lastDidString]) {
did = YES;
} else {
did = NO;
}
break;
}
case 2:
{
// If daily check day
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
formatter.dateFormat = @"yyyyMMdd";
NSString *nowString = [formatter stringFromDate:now];
NSString *lastDidString = [formatter stringFromDate:lastDid];
if ([nowString isEqualToString:lastDidString]) {
did = YES;
} else {
did = NO;
}
break;
}
case 3:
{
// If weekly check week
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
formatter.dateFormat = @"yyyyww";
NSString *nowString = [formatter stringFromDate:now];
NSString *lastDidString = [formatter stringFromDate:lastDid];
if ([nowString isEqualToString:lastDidString]) {
did = YES;
} else {
did = NO;
}
break;
}
default:
{
did = NO;
break;
}
}
return did;
}