在 iOS 中,我该如何执行以下操作:
我有两个NSDate
对象代表商店的营业时间和关闭时间。这些对象中的时间是准确的,但未指定日期(商店在同一时间打开和关闭,无论日期如何)。如何检查当前时间是否在此时间范围内?
请注意,如果将打开和关闭时间设为NSDate
对象以外的另一种格式会有所帮助,我可以接受。目前,我只是从文件中读取日期字符串,例如“12:30”,并使用日期格式化程序来创建匹配NSDate
对象。
在 iOS 中,我该如何执行以下操作:
我有两个NSDate
对象代表商店的营业时间和关闭时间。这些对象中的时间是准确的,但未指定日期(商店在同一时间打开和关闭,无论日期如何)。如何检查当前时间是否在此时间范围内?
请注意,如果将打开和关闭时间设为NSDate
对象以外的另一种格式会有所帮助,我可以接受。目前,我只是从文件中读取日期字符串,例如“12:30”,并使用日期格式化程序来创建匹配NSDate
对象。
更新: 请注意,此解决方案特定于您的情况,并假设商店营业时间不超过两天。例如,如果营业时间从周一晚上 9 点到周二上午 10 点,它将不起作用。因为晚上 10 点是在晚上 9 点之后,但不是在上午 10 点之前(一天内)。所以记住这一点。
我制作了一个函数,它会告诉你一个日期的时间是否在另外两个日期之间(它忽略了年、月和日)。还有第二个辅助函数,它为您提供了一个新的 NSDate,其中“中和”了年、月和日组件(例如,设置为某个静态值)。
想法是在所有日期之间将年、月和日组件设置为相同,以便比较仅依赖于时间。
我不确定这是否是最有效的方法,但它确实有效。
- (NSDate *)dateByNeutralizingDateComponentsOfDate:(NSDate *)originalDate {
NSCalendar *gregorian = [[[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
// Get the components for this date
NSDateComponents *components = [gregorian components: (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate: originalDate];
// Set the year, month and day to some values (the values are arbitrary)
[components setYear:2000];
[components setMonth:1];
[components setDay:1];
return [gregorian dateFromComponents:components];
}
- (BOOL)isTimeOfDate:(NSDate *)targetDate betweenStartDate:(NSDate *)startDate andEndDate:(NSDate *)endDate {
if (!targetDate || !startDate || !endDate) {
return NO;
}
// Make sure all the dates have the same date component.
NSDate *newStartDate = [self dateByNeutralizingDateComponentsOfDate:startDate];
NSDate *newEndDate = [self dateByNeutralizingDateComponentsOfDate:endDate];
NSDate *newTargetDate = [self dateByNeutralizingDateComponentsOfDate:targetDate];
// Compare the target with the start and end dates
NSComparisonResult compareTargetToStart = [newTargetDate compare:newStartDate];
NSComparisonResult compareTargetToEnd = [newTargetDate compare:newEndDate];
return (compareTargetToStart == NSOrderedDescending && compareTargetToEnd == NSOrderedAscending);
}
我用这段代码来测试它。可以看到年月日设置为一些随机值,不影响时间检查。
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"yyyy:MM:dd HH:mm:ss"];
NSDate *openingDate = [dateFormatter dateFromString:@"2012:03:12 12:30:12"];
NSDate *closingDate = [dateFormatter dateFromString:@"1983:11:01 17:12:00"];
NSDate *targetDate = [dateFormatter dateFromString:@"2034:09:24 14:15:54"];
if ([self isTimeOfDate:targetDate betweenStartDate:openingDate andEndDate:closingDate]) {
NSLog(@"TARGET IS INSIDE!");
}else {
NSLog(@"TARGET IS NOT INSIDE!");
}