当前时间是否匹配某个时间范围?

Does Current Time Match a Range of times?

我正在尝试在 iOS 应用程序上创建一个陷阱,以防止人们访问小型 window 之外的内容。

基本上,我只需要在伦敦(BST 时区)星期日下午 12 点到 1:30 之间触发操作。我将如何检查当前时间,将其转换为该时区,然后查看它是否匹配?

我试过以下方法,但它总是显示在该范围内:

- (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);
}
-(void)checkDate {
 NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
        [dateFormatter setDateFormat:@"EEEE HH:mm"];
        NSTimeZone *timeZone = [NSTimeZone timeZoneWithAbbreviation:@"BST"];
        [dateFormatter setTimeZone:timeZone];
        NSDate *openingDate = [dateFormatter dateFromString:@"Sunday 12:00"];
        NSDate *closingDate = [dateFormatter dateFromString:@"Sunday 1:30"];
        NSDate *targetDate = [NSDate date];

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

}

我假设您想使用在英国观察到的当前时间,而不是具体的 BST,因为 BST 是英国 夏季 时间。我的理解是,在冬天,他们使用 UTC(以前称为 GMT)。因此,我们应该以 select 基于一年中的时间与 UTC 的适当偏移的方式指定时区。

static BOOL dateIsAcceptable(NSDate *date) {
    NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
    calendar.timeZone = [NSTimeZone timeZoneWithName:@"Europe/London"];
    NSDateComponents *components = [calendar
        components:NSCalendarUnitWeekday | NSCalendarUnitHour | NSCalendarUnitMinute
        fromDate:date];
    if (components.weekday != 1) {
        return NO;
    }
    double hour = components.hour + components.minute / 60.0;
    return hour >= 12 && hour < 13.5;
}