时间间隔Xcode之间的共同时间

时间:2014-03-15 07:10:48

标签: objective-c xcode

我需要在两个时间间隔之间得到共同的时间。有没有办法做到这一点

例如,Interval1的时间是6:00 AM-11:00 PM,Interval2是7:00 AM-9:00 AM,这里的公共时间是从上午7:00到9:00 AM。我怎么能通过Objective C得到这个。有没有办法比较时间,请帮助我...

3 个答案:

答案 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