如何存储和比较时间数据对象

时间:2011-08-27 12:55:52

标签: iphone objective-c nsdate nstimeinterval

这应该很简单!

我有一家商店,营业时间为8:30,营业时间为17:00。我希望我的应用程序说明当前开放或当前关闭的商店。

存储open_time和close_time的最佳方法是什么?自一天开始以秒为单位存储它们,即30600和63000?

这是有道理的,但是我现在如何在今天开始的几秒钟内得到当前时间,所以我可以检查current_time是否在open_time和close_time之间,即打开!!

提前致谢!

3 个答案:

答案 0 :(得分:2)

这个问题并不像你想象的那么简单。你必须非常仔细地处理日期。最佳解决方案是将所有打开和关闭时间存储为日期。以下是一些用于创建打开/关闭时间并进行比较的代码:

NSDate * now = [NSDate date];
NSCalendar * calendar = [NSCalendar currentCalendar];
NSDateComponents * comps = [calendar components:~(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:now];
[comps setHour:8];
[comps setMinute:30];
NSDate * open = [calendar dateFromComponents:comps];
[comps setHour:17];
[comps setMinute:0];
NSDate * close = [calendar dateFromComponents:comps];

if ([now compare:open] == NSOrderedDescending && [now compare:close] == NSOrderedAscending) {
    // The date is within the shop's hours.
}
else {
    // The date is not within the shop's hours.
}

这就是我的所作所为:

  1. 抓住当前日期。

  2. 获取日期的组成部分,小时,分钟和秒钟除外。

  3. 设置小时和分钟。

  4. 创建一个开放时间。

  5. 重复步骤3-4以关闭时间。

  6. 比较开启和关闭时间到现在。

  7. 如果您需要对日期进行任何修改,则应始终使用NSCalendarNSDateComponents。查看this answer了解它为何如此重要。

答案 1 :(得分:1)

我认为更清晰的解决方案是使用仅存在小时/分钟组件的NSDate对象。

基本上,在您应用的某个地方,您需要存储商店的开/关时间:

NSCalendar *calendar = [[NSCalendar alloc] 
                         initWithCalendarIdentifier: NSGregorianCalendar];
NSDateComponents *openTime = [[NSDateComponents alloc] init];
[openTime setHour: 12];
[openTime setMinute: 30];
NSDate *openDate = [calendar dateFromComponents: openTime];
[calendar release];

如果您需要查看当前时间是否介于两个此类NSDate对象之间,您可以使用如下方法:

- (BOOL)currentTimeIsInBetween: (NSDate *)date1 andDate: (NSDate *)date2 {
    NSCalendar *calendar = [[NSCalendar alloc] 
                             initWithCalendarIdentifier: NSGregorianCalendar];
    NSDateComponents *currentComponents = [calendar components: 
                                   (NSMinuteCalendarUnit | NSHourCalendarUnit)
                                          fromDate: [NSDate date]];
    NSDate *currentAdjusted = [calendar dateFromComponents: currentComponents];
    [calendar release];

    if ([currentAdjusted compare: date1] == NSOrderedAscending)
        return NO;

    if ([currentAdjusted compare: date2] == NSOrderedDescending)
        return NO;

    return YES;
}
编辑:似乎用户rbrown比我快一点,我们建议采用相同的方法。

答案 2 :(得分:0)

你可以这样做。

NSDate *today = // code for getting today date at 0 oclock
NSDate *now = [NSDate date];
double second = [now timeIntervalSinceDate:today];

现在你从比赛开始就有时间进行比较。

相关问题