可靠地检查NSDate是否在给定的小时,天或周内

时间:2012-10-19 21:06:55

标签: objective-c ios nsdate nsdateformatter

我需要存储一个存储的NSDate并可靠地确定它是否属于当前时刻的小时,天或周。我似乎已经破解了一个解决方案,但之前没有解决过这个问题,我并不完全相信这是一个可靠的解决方案。

这会在12小时和24小时之间存活吗? the date formatting guide表示此用户设置可能会导致某些意外的日期行为:“在iOS中,用户可以覆盖默认的AM / PM与24小时时间设置。这可能会导致NSDateFormatter重写格式字符串你设置了。“

这个问题的基本代码模式怎么样?这段代码是否可靠地满足其目的?我讨厌发布一个“检查我的代码”的问题,但这对我来说是一个不熟悉的问题,并且非常难以严格测试,这似乎是合理的。 NSDateFormatter对我来说也比较新;这个问题的另一个动机。

注意:我紧张的主要原因是将日期转换为字符串然后进行字符串比较似乎是解决此问题的固有脆弱方法。但这是我能想到的最好的。

快速参考:我在三个案例中使用的dateFormat是:

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;
}

1 个答案:

答案 0 :(得分: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方法)以检查一周。< / p>