2

这应该很简单!

我有一家店,8:30开门,17:00关门。我希望我的应用程序显示当前营业或关闭的商店。

存储我的 open_time 和 close_time 的最佳方式是什么?将它们存储为自一天开始以来的秒数,即 30600 和 63000?

这是有道理的,但是我现在如何获取当前时间,从今天开始以秒为单位,所以我可以检查 current_time 是否在 open_time 和 close_time 之间,即打开!

提前致谢!

4

3 回答 3

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. 比较现在的开放和关闭时间。

如果您需要对日期进行任何修改,则应始终使用NSCalendarand NSDateComponents。查看这个答案,了解为什么它如此重要。

于 2011-08-27T14:02:29.473 回答
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 比我快一点,我们建议使用相同的方法。

于 2011-08-27T14:12:53.067 回答
0

你可以做这样的事情。

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

现在,您从一天开始就有时间进行比较。

于 2011-08-27T13:06:46.850 回答