2011-05-03 3 views
0

Je parle de cette fonction dans mon application. Je dois montrer quelques graphiques différents de différentes périodes. La période est choisie en faisant glisser le graphique actuel.Problème NSDate et DateByAddingComponents

J'ai des problèmes en utilisant les composants DateComponents. Quand je teste l'application, je montre la date éditée par les dateByAddingComponents, et il semble comme ça dans la console:

Date : 2009-12-14 10:06:13 GMT 
Date : 2009-11-13 10:06:13 GMT 
Date : 2009-10-12 09:06:13 GMT 
Date : 2009-09-11 09:06:13 GMT 
Date : 2009-08-10 09:06:13 GMT 
Date : 2009-07-09 09:06:13 GMT 
Date : 2009-06-08 09:06:13 GMT 
Date : 2009-05-07 09:06:13 GMT 
Date : 2009-04-06 09:06:13 GMT 
Date : 2009-03-05 10:06:13 GMT 
Date : 2009-02-04 10:06:13 GMT 
Date : 2009-01-03 10:06:13 GMT 
Date : 2008-12-02 10:06:13 GMT 
Date : 2008-11-01 10:06:13 GMT 
Date : 2008-09-30 09:06:13 GMT 
Date : 2008-08-29 09:06:13 GMT 

comme vous pouvez le voir, parfois changer de l'heure, mais le plus gros problème est qu'il ya manque un mois (le 10e de l'année 2008).

Il y a le code mis en œuvre pour les actions:

if (currentPosition.x > gestureStartPoint.x) { 
     switch (self.segmentedControl.selectedSegmentIndex) { 
      case 0: 
       [dateComponents setDay:-1]; 
       self.date = [gregorian dateByAddingComponents:dateComponents toDate:self.date options:0]; 
       NSLog(@"Date : %@", date); 
       break; 
      case 1: 
       //NSLog(@"before : %@", date); 
       [dateComponents setMonth:-1]; 
       self.date = [gregorian dateByAddingComponents:dateComponents toDate:self.date options:0]; 
       NSLog(@"Date : %@", date); 
       break; 
      case 2: 
       //NSLog(@"before : %@", date); 
       [dateComponents setYear:-1]; 
       self.date = [gregorian dateByAddingComponents:dateComponents toDate:self.date options:0]; 
       NSLog(@"Date : %@", date); 
       break; 
      default: 
       break; 
     } 

    } 
    else if(currentPosition.x <= gestureStartPoint.x){ 
     switch (self.segmentedControl.selectedSegmentIndex) { 
      case 0: 
       [dateComponents setDay:1]; 
       self.date = [gregorian dateByAddingComponents:dateComponents toDate:self.date options:0]; 
       NSLog(@"Date : %@", date); 
       break; 
      case 1: 
       [dateComponents setMonth:1]; 
       self.date = [gregorian dateByAddingComponents:dateComponents toDate:self.date options:0]; 
       NSLog(@"Date : %@", date); 
       break; 
      case 2: 
       [dateComponents setYear:1]; 
       self.date = [gregorian dateByAddingComponents:dateComponents toDate:self.date options:0]; 
       NSLog(@"Date : %@", date); 
       break; 
      default: 
       break; 
     } 
    } 

Comment puis-je résoudre ???

Répondre

1

Comment puis-je le résoudre?

En étant plus prudent. À partir des journaux vous nous montrez qu'il est clair que vous décrémentez la date par 1 mois et 1 jour à chaque fois. Alors, naturellement, lorsque vous atteignez le 2008-11-01, la prochaine date est 2008-09-30.

La différence d'une heure est due à l'heure d'été dans votre fuseau horaire.

+0

Merci pour l'indication des heures. Pour le mois, je ne sais pas où je décrémente d'un jour ... J'ai fini de relire la classe entière et je ne vois pas d'erreurs de ce genre. Lorsque je force le composant dateComponents ([dateComponents setDay: 0], setMonth: 1 et setYear: 0 suivi d'un dateByAddingComponents), l'erreur est toujours exécutée ... – clement

+0

En fait, j'ai dû mettre la dateComponents à 0 après l'avoir utilisée, si non, toutes les modifications à propos du composant datecomponent seront sauvegardées et désécurisées – clement