4

保存された NSDate を取得し、それが現時点の時間、日、または週に含まれるかどうかを確実に判断する必要があります。私は解決策をハックしたようですが、以前にこの問題を解決したことがないため、信頼できるものであると完全に確信していません.

これは、ユーザーが設定した 12 時間対 24 時間に耐えられますか? 日付フォーマット ガイドは、このユーザー設定が予期しない日付の動作につながる可能性があることを示しています。

この問題の基本的なコード パターンはどうですか? このコードは確実にその目的を果たしているように見えますか? 「コードをチェックしてください」というような質問を投稿するのは嫌いですが、それは私にはなじみのない問題であり、厳密にテストするのに十分なほどトリッキーであり、正当に思われました. NSDateFormatter も比較的新しいものです。質問のもう一つの動機。

注: 私の緊張の主な原因は、日付を文字列に変換してから文字列を比較することは、この問題を解決するための本質的に脆弱な方法のように思われることです。しかし、それは私が思いつくことができる最高のものです。

クイック リファレンス: dateFormat3 つのケースのそれぞれに使用した 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;
}
4

1 に答える 1

7

次のように NSDateComponents クラスを使用します。

NSDate *someDate = // whatever
NSDate *now = [NSDate date];
NSDateComponents *thenComponents = [[NSCalendar currentCalendar] components:NSHourCalendarUnit|NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:someDate];
NSDateComponents *nowComponents = [[NSCalendar currentCalendar] components:NSHourCalendarUnit|NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:now];
if([thenComponents year] == [nowComponents year] && [thenComponents month] == [nowComponents month] && [thenComponents day] == [nowComponents day] && [thenComponents hour] == [nowComponents hour])
{
    // hooray
}

単に日を確認したい場合は「時間」コンポーネントを削除するか、それと「日」の両方を削除して (およびメソッドに置き換えてNSWeekCalendarUnit)-week週を確認します。

于 2012-10-19T21:31:09.187 に答える