检查时间是否在两个保存的文本字符串时间之前或之后

时间:2012-05-16 21:36:59

标签: ios xcode nsdate nsdateformatter

我有两次存储在NSDictionary中。 “开始时间”是22:30,“结束时间”是凌晨4:00。

我需要弄清楚当前时间是在开始时间之前,结束时间之前,还是在结束时间之后以及下一次开始时间到来之前。

我确信我的复杂程度要远远超过它需要的程度,但是在试图掩盖所有可能性时,我已经完全混淆了自己。

NSDictionary *noaudio = [[NSUserDefaults standardUserDefaults] objectForKey:@"NoSound"];
NSDateFormatter *tformat = [[NSDateFormatter alloc] init];
[tformat setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];  
[tformat setDateFormat:@"HH:mm"];

date1 = [tformat dateFromString:[noaudio objectForKey:@"start"]];
date2 = [tformat dateFromString:[noaudio objectForKey:@"end"]];
date3 = [NSDate date];

我是否必须同时检查日期1和2与3?

感谢您对此提供的任何指导。

2 个答案:

答案 0 :(得分:1)

嗯,只有两次而且没有日期,你只能知道当前时间是否在开始和结束时间之间。这是因为,在上面的例子中(开始时间22:30和结束时间04:00)你会在13:00返回什么?今天结束时间(04:00)“开始时间”(22:30)之后 “”。

话虽如此,这是检查当前时间是否在两个日期中指定的时间之间的一种方法。您可以通过将所有内容保留为NSDate(使用日历操作)来实现此目的,但这会使其变得更加复杂,因为您必须使用指定时间的今天日期创建新的NSDate对象。这不是太难,但除非你在其他地方使用它们,否则没有理由这样做。

// Take a date and return an integer based on the time.
// For instance, if passed a date that contains the time 22:30, return 2230
- (int)timeAsIntegerFromDate:(NSDate *)date {
    NSCalendar *currentCal      = [NSCalendar currentCalendar];
    NSDateComponents *nowComps  = [currentCal components:NSHourCalendarUnit|NSMinuteCalendarUnit fromDate:date];
    return nowComps.hour * 100 + nowComps.minute;
}

// Check to see if the current time is between the two arbitrary times, ignoring the date portion:
- (BOOL)currentTimeIsBetweenTimeFromDate1:(NSDate *)date1 andTimeFromDate2:(NSDate *)date2 {
    int time1     = [self timeAsIntegerFromDate:date1];
    int time2     = [self timeAsIntegerFromDate:date2];
    int nowTime   = [self timeAsIntegerFromDate:[NSDate date]];

    // If the times are the same, we can never be between them
    if (time1 == time2) {
        return NO;
    }

    // Two cases:  
    // 1.  Time 1 is smaller than time 2 which means that they are both on the same day
    // 2.  the reverse (time 1 is bigger than time 2) which means that time 2 is after midnight
    if (time1 < time2) { 
        // Case 1
        if (nowTime > time1) {
            if (nowTime < time2) {
                return YES;
            }
        }
        return NO;
    } else { 
        // Case 2
        if (nowTime > time1 || nowTime < time2) {
            return YES;
        }
        return NO;
    }
}

答案 1 :(得分:0)

为什么不直接将NSDate存储在NSDictionary中?然后,您可以使用timeIntervalSinceReferenceDatetimeIntervalSince1970获取NSTimeInterval(实际上只是一个双倍)并进行简单比较。

如果你有时间,就不可能判断他们是否在同一个日期,所以我看不到一个通用的解决方案,当开始时间在午夜之前,结束时间之后。 ..

在任何情况下,即使你不能只存储NSDate(这是否是这种情况?时间是来自某些外部来源吗?),如果你转换你的生活将会简单得多到一个双倍,只是使用&lt;和&gt;。