我需要在两个时间间隔之间得到共同的时间。有没有办法做到这一点
例如,Interval1的时间是6:00 AM-11:00 PM,Interval2是7:00 AM-9:00 AM,这里的公共时间是从上午7:00到9:00 AM。我怎么能通过Objective C得到这个。有没有办法比较时间,请帮助我...
答案 0 :(得分:2)
创建一个描述间隔开始和结束日期的类。
.h文件:
@interface Interval
@property (readonly, nonatomic) NSDate *startDate;
@property (readonly, nonatomic) NSDate *finishDate;
- (id)initWithStartDate:(NSDate *)startDate finishDate:(NSDate *)finishDate;
- (NSTimeInterval)timeInterval;
- (Interval *)commonIntervalWith:(Interval *)interval;
@end
.m文件:
@implementation
- (id)initWithStartDate:(NSDate *)startDate finishDate:(NSDate *)finishDate
{
_startDate = startDate;
_finishDate = finishDate;
}
- (NSTimeInterval)timeInterval
{
// If startDate or finishDate is nil then return 0,
// otherwise return interval between dates
return _startDate ? [_finishDate timeIntervalSinceDate:_startDate] : 0;
}
- (Interval *)commonIntervalWith:(Interval *)interval
{
NSDate *lastStartDate = [_startDate timeIntervalSinceDate:interval.startDate] > 0 ? _startDate : interval.startDate;
NSDate *earliestFinishDate = [_finishDate timeIntervalSinceDate:interval.finishDate] > 0 ? interval.finishDate : _finishDate;
if([lastStartDate timeIntervalSinceDate:earliestFinishDate] > 0)
{
return [[Interval alloc] initWithStartDate:nil finishDate:nil];
}
return [[Interval alloc] initWithStartDate:lastStartDate finishDate:earliestFinishDate];
}
@end
用法示例:
NSDate *date1 = ...; //Interval1 start date
NSDate *date2 = ...; //Interval1 finish date
NSDate *date3 = ...; //Interval2 start date
NSDate *date4 = ...; //Interval2 finish date
Interval *interval1 = [[Interval alloc] initWithStartDate:date1 finishDate:date2];
Interval *interval2 = [[Interval alloc] initWithStartDate:date3 finishDate:date4];
Interval *commonInterval = [interval1 commonIntervalWith:interval2];
NSTimeInterval commonTimeInterval = [commonInterval timeInterval];
要将日期的字符串表示形式转换为NSDate,请使用NSDateFormatter。
答案 1 :(得分:1)
你有两个字符串,首先你必须把它们变成日期:
//setup a formatter
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"hh:mm a"];
NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[dateFormatter setLocale:usLocale];
NSTimeZone *gmt = [NSTimeZone timeZoneWithName:@"GMT"];
[dateFormatter setTimeZone:gmt];
//convert 1. range
NSString *dateRange1 = @"6:00 AM - 11:00 AM";
NSArray *dateRangeComps1 = [dateRange1 componentsSeparatedByString:@" - "];
NSDate *startDate1 = [dateFormatter dateFromString:dateRangeComps1[0]];
NSDate *endDate1 = [dateFormatter dateFromString:dateRangeComps1[1]];
NSLog(@"%@ - %@", startDate1, endDate1);
//convert 2. range
NSString *dateRange2 = @"7:00 AM - 9:00 AM";
NSArray *dateRangeComps2 = [dateRange2 componentsSeparatedByString:@" - "];
NSDate *startDate2 = [dateFormatter dateFromString:dateRangeComps2[0]];
NSDate *endDate2 = [dateFormatter dateFromString:dateRangeComps2[1]];
NSLog(@"%@ - %@", startDate2, endDate2);
然后计算重叠
//overlapping date range
NSDate *latestStartDate = [startDate1 laterDate:startDate2];
NSDate *earliestEndDate = [endDate1 earlierDate:endDate2];
if([latestStartDate timeIntervalSinceDate:earliestEndDate] <= 0) {
NSLog(@"%@ - %@", latestStartDate, earliestEndDate);
}
else {
NSLog(@"No Overlap");
}
答案 2 :(得分:-1)
您可以从时间中构建NSDate
个对象,并通过NSDate
&#39; s timeIntervalSinceDate:
进行比较。请参阅NSDate reference。
NSDate* date1 = /*however you got the date */;
NSDate* date2 = /*however you got the date */;
NSTimeInterval difference = [date1 timeIntervalSinceDate:date2];
如果您的日期是字符串,则可以通过NSDate
将其转换为NSDateFormatter
。请参阅NSDateFormatter reference。