检查NSDate对象的时间是否已经过

时间:2015-05-18 17:01:51

标签: ios nsdate nsdateformatter

我试图检查NSDate的时间是否已经过去。我使用了以下,但显然有一年,所以它已经过去了。我如何只检查NSDate对象的时间,只有小时和分钟很重要:

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"HH:mm:ss"];
[dateFormat setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
NSDate *date = [dateFormat dateFromString:openingDay.endTime];

if ([date timeIntervalSinceNow] < 0.0) {

}

但是日期是:

2000-01-01 5:30:00 p.m. +0000

时间字符串的格式为'HH:mm:ss'

我试着寻找答案,因为我觉得这很常见,但没有运气。

编辑:

我应该详细说明一下,我从一个字符串的服务器上得到一些时间。我想检查一下这个时间是否过去了。字符串是商店营业时间的结束时间,因此我想检查商店是否已关闭。

EDIT2:

我从Json对象获取的字符串是end_time:17:30:00。然后我想检查当前时间是否在此时间之后,如果是,则显示关闭的UIAlertView。我的方法是取这个字符串并将其转换为日期对象并将其与当前时间进行比较。然而,当我将它转换为NSDate对象时,年份是2000,这显然是过去。我希望我提供的足够。

1 个答案:

答案 0 :(得分:2)

要获取小时和分钟组件,请执行以下操作:

NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:date];
NSInteger hour = [components hour];
NSInteger minute = [components minute];

然后,您可以创建帮助方法以保持代码的有序性:

- (NSInteger)hourFromDate:(NSDate *)date {
    return [[NSCalendar currentCalendar] component:(NSCalendarUnitHour) fromDate:date];
}

- (NSInteger)minuteFromDate:(NSDate *)date {
    return [[NSCalendar currentCalendar] component:(NSCalendarUnitMinute) fromDate:date];
}

请注意component:fromDate:直接返回该组件(NSInteger),因为每个参数只能获取一个组件类型,而components:fromDate:会返回NSDateComponents,然后NSDate *endDate = [dateFormat dateFromString:openingDay.endTime]; NSDate *today = [NSDate date]; NSInteger endDateHour = [self hourFromDate:endDate]; NSInteger endDateMinute = [self minuteFromDate:endDate]; NSInteger todayHour = [self hourFromDate:date]; NSInteger todayMinute = [self minuteFromDate:date]; BOOL hasEndMinutePassed = endDateMinute > todayMinute; BOOL hasEndHourPassed = endDateHour > todayHour; if ((hasEndHourPassed) || (endDateHour == todayHour && hasEndMinutePassed)) { //Yep, it passed } else { //Nope, it didn't } 你可以抓住多个组件。

然后只是:

@interface NSDate (Components)

- (NSInteger)hour;
- (NSInteger)minutes;

@end

我这样写是为了让事情井然有序。 你也可以写一个类别:

标题文件:

#import "NSDate+Components.h"

@implementation NSDate (Components)

- (NSInteger)hour {
    return [[NSCalendar currentCalendar] component:NSCalendarUnitHour fromDate:self];
}

- (NSInteger)minute {
    return [[NSCalendar currentCalendar] component:NSCalendarUnitMinute fromDate:self];
}

实施档案:

- (BOOL)hourAndMinutesPassedFromDate:(NSDate *)date;

您可以更进一步,并在类别本身中添加比较逻辑:

将其添加到标题中:

- (BOOL)hourAndMinutesPassedFromDate:(NSDate *)date {
    BOOL hasEndMinutePassed = [self minute] > [date minute];
    BOOL hasEndHourPassed = [self hour] > [date hour];

    return ((hasEndHourPassed) || ([self hour] == [date hour] && hasEndMinutePassed));
}

然后执行:

{{1}}

多数民众赞成。我没有测试逻辑本身(但它应该是准确的,我之前使用过类似的东西),当然你可以自由地修改它以满足你的需要。