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

Check if time of NSDate object has passed

我正在尝试检查 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'

我试着寻找答案,因为我认为这很常见,但运气不好。

编辑:

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

编辑2:

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

要获取小时和分钟部分,您可以这样做:

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:returns 直接表示该组件(如 NSInteger),因为每个参数只能采用一种组件类型,而 components:fromDate: returns一个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
}

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

Header 文件:

@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];
}

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

将此添加到 header:

- (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));
}

就是这样。我没有测试逻辑本身(但它应该是准确的,我以前使用过类似的东西),当然你可以随意修改它以满足你的需要。