2015-04-05 1 views
0

Je souhaite activer une fonctionnalité permettant à l'utilisateur d'exécuter une fonctionnalité seulement APRÈS 1 heure à partir de l'heure actuelle. Que dois-je passer en paramètre toDate dans le code ci-dessous pour obtenir le décalage horaire de 1 heure par rapport à l'heure actuelle? Je ne sais pas comment définir l'heure future dans NSDateFormatter OU NSDateComponents. Donc, je ne pouvais pas écrire ce que j'ai essayé.Comment obtenir le décalage horaire de 1 heure à partir de NSDate

- (NSInteger)timeDifference:(NSDate *)fromDate ToDate:(NSDate *)toDate 
{ 

    NSLog(@" FromDate: %@, ToDate: %@",fromDate,toDate); 

    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSDateComponents *differenceValue = [calendar components:NSHourCalendarUnit 
                fromDate:fromDate toDate:toDate options:0]; 
    NSLog(@"Calculated hour difference : %d",[differenceValue hour]); 
    NSInteger hourDifference = [differenceValue hour]; 

    NSLog(@" HourDifference: %d",hourDifference); 
    return hourDifference; 
} 

Répondre

3

Si vous voulez créer une date qui est à une heure plus tard, une date précise, vous pouvez utiliser la méthode dateByAddingTimeInterval, comme:

NSDate *date = [NSDate date]; 
NSDate *plusOneHour = [date dateByAddingTimeInterval:60.0f * 60.0f]; 

NSLog(@"%@, %@", date, plusOneHour); 

MISE À JOUR

Comme @uchuugaka déclaré, vous pouvez trouver la version en utilisant les méthodes de calendrier here.

+1

C'est l'approche naïve et incorrecte qui provoquera des erreurs. – uchuugaka

+0

@uchuugaka Je n'ai jamais entendu dire que cette méthode ne fonctionne pas correctement, mais vous pourriez avoir raison. –

+0

Cela fonctionnera beaucoup de temps, mais NSDate est un wrapper mince autour de l'intervalle de temps et ne connaît pas la partie humaine des calendriers et des fuseaux horaires. Dans un sens, c'est correct. Mais en réalité, il manque tous les trucs fous qui se produisent avec ce qui sont des cas de coin arbitraires légiférés. – uchuugaka

1

Voir l'en-tête NSCalendar pour les méthodes pratiques. Regardez également la vidéo WWDC de 2013 sur le thème des calculs calendriers. Ce truc a été très lent à faire dans les docs et simplement ajouter un intervalle de temps est plusieurs fois une erreur. Tous les composants sont importants pour bien faire les choses. Vous devez avoir un calendrier et un fuseau horaire pour avoir une augmentation sémantiquement significative des heures.

C'est un piège lorsqu'il s'agit de minuit, de l'année bissextile et de l'heure d'été, ce qui est différent partout.

Plus précisément dans ce cas, je recommanderais ce NSCalendar.h de

/* 
    This API returns a new NSDate object representing the date calculated by adding an amount of a specific component to a given date. 
    The NSCalendarWrapComponents option specifies if the component should be incremented and wrap around to zero/one on overflow, and should not cause higher units to be incremented. 
*/ 
- (NSDate *)dateByAddingUnit:(NSCalendarUnit)unit value:(NSInteger)value toDate:(NSDate *)date options:(NSCalendarOptions)options NS_AVAILABLE(10_9, 8_0); 

Mais il existe plusieurs méthodes dans cette tête qui suffirait. S'il vous plaît regarder la vidéo WWDC attentivement quelques fois. Cela vaut bien votre temps et l'expérience de vos utilisateurs sera meilleure.