Mur*_*ock 4 objective-c nsdate nsdateformatter ios
我需要一个存储的NSDate并可靠地确定它是否属于当前时刻的一小时,一天或一周.我似乎已经破解了一个解决方案,但之前没有解决过这个问题,我并不完全相信它是一个可靠的解决方案.
用户设置12对24小时时间是否会存活?日期格式指南表明此用户设置可能会导致一些意料之外的日期行为:"在iOS中,用户可以覆盖默认的AM/PM与24小时时间设置.这可能会导致NSDateFormatter重写您设置的格式字符串."
这个问题的基本代码模式怎么样?这段代码是否可靠地满足其目的?我讨厌发布一个"检查我的代码"的问题,但这对我来说是一个不熟悉的问题,并且非常难以严格测试,这似乎是合理的.NSDateFormatter对我来说也比较新; 这个问题的另一个动机.
注意:我紧张的主要原因是将日期转换为字符串然后进行字符串比较似乎是解决此问题的固有脆弱方法.但这是我能想到的最好的.
快速参考:dateFormat我在三个案例中使用的s是:
dateFormat = @"yyyyMMddHH"; // For "this hour" check
dateFormat = @"yyyyMMdd"; // For "today" check
dateFormat = @"yyyyww"; // For "this week" check
Run Code Online (Sandbox Code Playgroud)
谢谢!代码遵循:
- (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;
}
Run Code Online (Sandbox Code Playgroud)
使用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
}
Run Code Online (Sandbox Code Playgroud)
如果您只想检查当天,请删除"小时"组件,或删除那个和"日"(并替换为NSWeekCalendarUnit和-week方法)以检查一周.