如何确定在任意NSDate期间是否发生了NSTimeInterval?

时间:2009-06-04 00:08:32

标签: objective-c cocoa cocoa-touch

我有一个NSTimeInterval,我想知道该时间戳是否落在日期的开始和结束之间。基本上我需要能够做到这样的事情:

NSDate *today = [NSDate date];
NSTimeInterval myInterval = someInterval;

[date returnYesIfFallsThisDate:myInterval];

是否有直接的方法来确定我的NSTimeInterval是否与NSDate对象同一天?

谢谢大家。

4 个答案:

答案 0 :(得分:1)

从概念上讲,您希望两个日期构成相关目标日期的“开始”和“结束”。然后,您可以直接针对这些日期的相应时间间隔测试时间间隔。

例如,如果我住在旧金山,那么我希望“开始”时间为太平洋时间上午12点,结束时间为太平洋时间11:59:59.99999。

一旦你弄清楚你想要考虑哪些时区/等等作为起点和终点,你可以使用时间间隔来进行测试:

if ((myInterval >= [earlyMorningDate timeIntervalSinceReferenceDate]) && 
    (myInterval <= [lateEveningDate timeIntervalSinceReferenceDate]))
{
    NSLog(@"Whoo hoo - it's the right date!");
}

答案 1 :(得分:1)

请记住,NSDate并不代表任何形式的“日期”,只是一个时间点。您必须使用NSDateComponents做一些工作,使用NSCalendar(通常是用户的默认日历)进行转换以找出开始和结束NSDate值,并比较使用它们来比较您的时间间隔。

我首先考虑你日内的NSDate,并将其转换为NSDateComponents,但不需要几小时,几分钟或几秒钟。这是一个帮助您入门的快速(未经测试)示例:

NSDateComponents *comps = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit) fromDate:[NSDate date]];
NSDateComponents *day = [[[NSDateComponents alloc] init] autorelease];
[day setDay:1];
NSDate *start = [[NSCalendar currentCalendar] dateFromComponents:comps];
NSDate *end = [[NSCalendar currentCalendar] dateByAddingComponents:day toDate:start options:0];

然后你可以比较Jalkut先生建议的时间间隔(或者另一种方法,NSDate可以用几种不同的方式使用NSTimeIntervals)。我肯定会花一些时间查看文档中的NSCalendar和NSDateComponents,你可能会发现一种比我建议的更好的方法。

答案 2 :(得分:1)

NSTimeInterval只是几秒钟。要将它与NSDate进行比较,您需要解释相对于某个参考点的时间间隔,然后使用结果创建一个NSDate,然后比较两个NSDate。

有两个标准参考日期:2001-01-011970-01-01(后者是“UNIX时间”)。如果这些都不是正确的参考日期,请使用NSCalendar为正确的参考日期创建NSDate,然后create your NSDate of interest relative to that

现在进行比较。

如果您关心的是日历上的日期,那么您将创建NSDate,然后使用NSCalendar获取日期的NSDateComponents。具体来说,您将获得年,月和月的日期,然后进行比较。

无需担心“开始”和“结束”时间;事实上,如果你只关心日历上的日期,你可以完全忽略时间。

答案 3 :(得分:1)

仅仅是我还是OP似乎认为NSTimeInterval是从A到B的时间间隔的表示?即从日期A到日期B的绝对距离(以秒为单位)。

原始问题需要暂停,以表明您需要根据参考日期找到它。像这样:

NSDate *refDate = someReferenceDate;
NSTimeInterval interval = someInterval;
NSDate *today = [NSDate date];
BOOL isInRange = false;

isInRange = [today isInterval:interval inRangeFromReference:refDate];

然后,这种方法将使用Damiel,Peter和Marc提到的一些(或所有部分)初学者。