2016-03-09 3 views
1

Я написал так, чтобы рассчитать час разницы.Расчет разницы в часах 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 9:07:44 +0000 (toDateTime),

разница всегда 2 часа. Фактически, это должно быть 1 час и 10 минут. В результате я хочу показать только 1 час. Есть ли способ округлить вверх или вниз?

+0

Вы можете изменить протокол от '' fromDateTime' и toDateTime' до 0, прежде чем вычислить разницу, то результат будет один час. –

+0

@FabioBerger Я думаю, он хочет количество часов между датами, и в этом случае этого будет недостаточно (думаю, 25 часов). – Eiko

+0

@Eiko Да, он хочет часы между датами, но его проблема - минуты. Если вы установите минуты обеих дат равными 0, то расчеты календаря верны, независимо от того, насколько далеки даты друг от друга. –

ответ

2

Если вас интересует «неформатированное» количество часов между датами, вы можете использовать NSTimeInterval и рассчитать его легко.

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

Что произойдет, если я не установлю часовой пояс в вашем методе? –

+1

Часовой пояс и календарь не учитываются при расчете разницы во времени. Один час всегда один час, и NSDate позаботится об этом, так как он обращает внимание на часовой пояс. – Eiko

+0

@vadian Можете ли вы дать четкую ссылку или пример, когда это неправильно? NSDate должен учитывать это, и я бы подумал, что ручная работа с компонентами сделает проблему с летним днем ​​проблемой. – Eiko

0

Это небольшое расширение 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 
+0

Просьба указать «небольшое расширение NSCalendar» в объекте c :) –

0

Вы вырван только час компонент (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+, вы должны использовать NSCalendarUnitHour и NSCalendarUnitMinute вместо этого как NSHourCalendarUnit и NSMinuteCalendarUnit были устаревшими.

0

Изменить эту функцию согласно вашему требованию

+(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 @""; 

} 
Смежные вопросы