如何检查当前时间是否在ios的指定范围内?

时间:2012-10-27 16:41:03

标签: objective-c ios

  

可能重复:
  Determine if current local time is between two times (ignoring the date portion)

在iOS中,我该如何执行以下操作:

我有两个NSDate个对象,代表商店的开始和结束时间。这些对象中的时间是准确的,但未指定日期(无论日期如何,商店都会同时打开和关闭)。如何检查当前时间是否介于此时间范围内?

注意,如果打开和关闭时间有助于NSDate对象以外的其他格式,我对此很好。目前,我只是从文件中读取日期字符串,如“12:30”,并使用日期格式化程序创建匹配的NSDate对象。

1 个答案:

答案 0 :(得分:15)

更新:请注意,此解决方案特定于您的情况,并假设商店营业时间不超过两天。例如,如果开放时间从周一晚上9点到周二早上10点,它将无法工作。从晚上10点开始是在晚上9点之后,但不是在上午10点之前(一天之内)。所以记住这一点。

我编写了一个函数,它会告诉你一个日期的时间是否在两个其他日期之间(忽略了年,月和日)。还有第二个辅助函数,它为您提供一个新的NSDate,其中年,月和日组件被“中和”(例如设置为某个静态值)。

我们的想法是在所有日期之间将年,月和日组件设置为相同,以便比较仅依赖于时间。

我不确定这是否是最有效的方法,但它确实有效。

- (NSDate *)dateByNeutralizingDateComponentsOfDate:(NSDate *)originalDate {
    NSCalendar *gregorian = [[[NSCalendar alloc]
                              initWithCalendarIdentifier:NSGregorianCalendar] autorelease];

    // Get the components for this date
    NSDateComponents *components = [gregorian components:  (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate: originalDate];

    // Set the year, month and day to some values (the values are arbitrary)
    [components setYear:2000];
    [components setMonth:1];
    [components setDay:1];

    return [gregorian dateFromComponents:components];
}

- (BOOL)isTimeOfDate:(NSDate *)targetDate betweenStartDate:(NSDate *)startDate andEndDate:(NSDate *)endDate {
    if (!targetDate || !startDate || !endDate) {
        return NO;
    }

    // Make sure all the dates have the same date component.
    NSDate *newStartDate = [self dateByNeutralizingDateComponentsOfDate:startDate];
    NSDate *newEndDate = [self dateByNeutralizingDateComponentsOfDate:endDate];
    NSDate *newTargetDate = [self dateByNeutralizingDateComponentsOfDate:targetDate];

    // Compare the target with the start and end dates
    NSComparisonResult compareTargetToStart = [newTargetDate compare:newStartDate];
    NSComparisonResult compareTargetToEnd = [newTargetDate compare:newEndDate];

    return (compareTargetToStart == NSOrderedDescending && compareTargetToEnd == NSOrderedAscending);
}

我用这段代码来测试它。您可以看到年,月和日被设置为某些随机值,并且不会影响时间检查。

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"yyyy:MM:dd HH:mm:ss"];

NSDate *openingDate = [dateFormatter dateFromString:@"2012:03:12 12:30:12"];
NSDate *closingDate = [dateFormatter dateFromString:@"1983:11:01 17:12:00"];
NSDate *targetDate = [dateFormatter dateFromString:@"2034:09:24 14:15:54"];

if ([self isTimeOfDate:targetDate betweenStartDate:openingDate andEndDate:closingDate]) {
    NSLog(@"TARGET IS INSIDE!");
}else {
    NSLog(@"TARGET IS NOT INSIDE!");
}