正在计算时差 iOS

Calculating hour difference iOS

我这样写是为了计算时差

+ (NSInteger)hoursBetweenDate:(NSDate*)fromDateTime andDate:(NSDate *)toDateTime
{
    NSDate *fromDate;
    NSDate *toDate;

    NSCalendar *calendar = [NSCalendar currentCalendar];

    [calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

    [calendar rangeOfUnit:NSHourCalendarUnit startDate:&fromDate
             interval:NULL forDate:fromDateTime];
    [calendar rangeOfUnit:NSHourCalendarUnit startDate:&toDate
             interval:NULL forDate:toDateTime];

    NSDateComponents *difference = [calendar components:NSHourCalendarUnit
                                           fromDate:fromDate toDate:toDate options:0];

    return [difference hour];
}

问题是如果这样输入,

2016-03-09 07:58:39 +0000 (fromDateTime) 2016-03-09 09:07:44 +0000 (toDateTime),

始终相差 2 小时。实际上,它应该是 1 小时 10 分钟。结果,我只想展示1小时。有没有办法向上或向下舍入?

这个小的 NSCalendar 扩展应该能帮到您。

extension NSCalendar {
    func hoursBetweenDates(startDate: NSDate, endDate: NSDate) -> Int {
        let days  = differenceInDates(startDate, endDate: endDate, unit: .Hour)
        return days
    }

    func differenceInDates(startDate: NSDate, endDate: NSDate, unit: NSCalendarUnit) -> Int {
        let startUnit    = ordinalityOfUnit(unit, inUnit: .Era, forDate:startDate)
        let endUnit      = ordinalityOfUnit(unit, inUnit: .Era, forDate:endDate)
        let difference   = endUnit-startUnit

        return difference
    }
}

而Obj-C版本可以这样写:

@interface NSCalendar (Duration)
-(NSNumber *)hoursBetweenStartDate:(NSDate*)startDate andEndDate:(NSDate*) endDate;
@end

@implementation NSCalendar (Duration)
-(NSNumber *)hoursBetweenStartDate:(NSDate*)startDate andEndDate:(NSDate*) endDate {

    NSUInteger startUnit = [self ordinalityOfUnit:NSCalendarUnitHour inUnit:NSCalendarUnitEra forDate:startDate];
    NSUInteger endUnit   = [self ordinalityOfUnit:NSCalendarUnitHour inUnit:NSCalendarUnitEra forDate:endDate];

    return [NSNumber numberWithUnsignedInteger: (endUnit - startUnit)];
}
@end

你在比较之前只提取了小时部分(NSHourCalendarUnit),这就是为什么它总是2(9 - 7).添加 NSMinuteCalendarUnit 结果将是 1:

+ (NSInteger)hoursBetweenDate:(NSDate*)fromDateTime andDate:(NSDate *)toDateTime
{
    NSDate *fromDate;
    NSDate *toDate;

    NSCalendar *calendar = [NSCalendar currentCalendar];

    [calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

    [calendar rangeOfUnit:NSHourCalendarUnit|NSMinuteCalendarUnit startDate:&fromDate
                 interval:NULL forDate:fromDateTime];
    [calendar rangeOfUnit:NSHourCalendarUnit|NSMinuteCalendarUnit startDate:&toDate
                 interval:NULL forDate:toDateTime];

    NSDateComponents *difference = [calendar components:NSHourCalendarUnit
                                               fromDate:fromDate toDate:toDate options:0];

    return [difference hour];
}

此外,如果您的目标是 iOS 8+,您应该使用 NSCalendarUnitHourNSCalendarUnitMinute,因为 NSHourCalendarUnitNSMinuteCalendarUnit 已被弃用。

如果您只对日期之间的 "unformatted" 小时数感兴趣,可以使用 NSTimeInterval 并轻松计算。

+(int)fullHoursBetweenDate:(NSDate *)date1 andDate:(NSDate *)date2 {
    NSTimeInterval interval = [date2 timeIntervalSinceDate:date1];
    return (int)interval / 3600;
}

根据您的要求修改此功能

+(NSString*)timeDifference:(NSDate*)startDate endDate:(NSDate*)endDate{

NSDateComponents *components;
NSInteger days;
NSInteger hour;
NSInteger minutes;
NSString *strDuration;


components = [[NSCalendar currentCalendar] components: NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute
                                             fromDate: startDate toDate: endDate options: 0];
days = [components day];
hour=[components hour];
minutes=[components minute];

if(days>0){

    if(days>1){
        strDuration=[NSString stringWithFormat:@"%d days",days];
    }
    else{
        strDuration=[NSString stringWithFormat:@"%d day",days];

    }
    return strDuration;
}

if(hour>0){

    if(hour>1){
        strDuration=[NSString stringWithFormat:@"%d hours",hour];
    }
    else{
        strDuration=[NSString stringWithFormat:@"%d hour",hour];

    }
    return strDuration;
}

if(minutes>0){

    if(minutes>1){
        strDuration=[NSString stringWithFormat:@"%d minutes",minutes];
    }
    else{
        strDuration=[NSString stringWithFormat:@"%d minute",minutes];

    }
    return strDuration;
}

return @"";

}