2012-04-25 15 views
26

Qui sto cercando di calcolare le ore tra due date. Quando eseguo l'applicazione, si blocca. Potresti dirmi l'errore in questo codice?Differenza in ore tra due NSDate

NSString *lastViewedString = @"2012-04-25 06:13:21 +0000"; 
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateFormat: @"yyyy-MM-dd HH:mm:ss zzz"]; 

NSDate *lastViewed = [[dateFormatter dateFromString:lastViewedString] retain]; 
NSDate *now = [NSDate date]; 

NSLog(@"lastViewed: %@", lastViewed); //2012-04-25 06:13:21 +0000 
NSLog(@"now: %@", now); //2012-04-25 07:00:30 +0000 

NSTimeInterval distanceBetweenDates = [now timeIntervalSinceDate:lastViewed]; 
double secondsInAnHour = 3600; 
NSInteger hoursBetweenDates = distanceBetweenDates/secondsInAnHour; 

NSLog(@"hoursBetweenDates: %@", hoursBetweenDates); 
+3

NSLog (@ "hoursBetweenDates:% d", hoursBetweenDates); – adali

+1

Non ha senso incorporare le modifiche che risolvono il problema nel codice della domanda. Dopo averlo modificato, il tuo codice non si blocca più, quindi ho eseguito il rollback della versione originale della domanda. –

+0

Attiva gli avvisi nel tuo compilatore. C'è un bug grave e, con gli avvisi attivati, il compilatore ti avrebbe parlato di questo. – gnasher729

risposta

11

Credo che differenza dovrebbe essere di valore int ...

NSLog(@"hoursBetweenDates: %d", hoursBetweenDates); 

Speranza, questo vi aiuterà a ..

+0

sì hai ragione, grazie Nit – shebi

11

riferimento alla this answer of a mostly similar question una migliore e Apple approvato modo sarebbe utilizzando i metodi NSCalendar come questo:

- (NSInteger)hoursBetween:(NSDate *)firstDate and:(NSDate *)secondDate { 
    NSUInteger unitFlags = NSCalendarUnitHour; 
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    NSDateComponents *components = [calendar components:unitFlags fromDate:firstDate toDate:secondDate options:0]; 
    return [components hour]+1; 
} 

Se il target iOS 8 o versioni successive utilizzano NSCalendarIdentifierGregorian anziché il NSGregorianCalendar deprecato.