2011-02-14 6 views
1

Je ne suis pas sûr de ce qui se passe avec ça. J'essaie de charger un objet NSString * à partir d'un fichier, de le convertir en NSDate * avec un formateur de date, puis de convertir les composants heure et minute en NSString afin que je puisse afficher une heure dans Interface Builder. Cependant, au lieu de l'heure qui a été enregistrée dans le fichier, je me retrouve avec 19 pour l'heure, et 0 pour la minute. (Indépendamment de ce qui a été mis, le programme charge quatre NSDates différents)NSDate ne va pas charger/afficher correctement

Voici le code pour charger la date du fichier (j'ai vérifié avec des points d'arrêt, et le tableau a effectivement les données correctes, ainsi ce n'est pas le problème

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"yyyy-MM-dd hh:mm:ss a"]; 
date1 = [[df dateFromString:[loadArray objectAtIndex:3]] retain]; 

Voici le code d'affichage de la date.

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *comp = [[gregorian components:NSHourCalendarUnit|NSMinuteCalendarUnit fromDate:myDrug.date1] retain]; 
hourField1.text = [NSString stringWithFormat:@"%d", comp.hour]; 
minuteField1.text = [NSString stringWithFormat:@"%d", comp.minute]; 

(hourField1 et minuteField1 sont les IBOutlets qui reçoivent les valeurs, par la voie)

Je ne sais pas où je suis allé mal ici, et toute aide serait grandement appréciée. Merci!

Mise à jour: Sur la suggestion de certaines des personnes ici, j'ai NSLogged le problème, et j'ai trouvé que c'est le formateur de date qui ne fonctionne pas. Une date d'exemple est 2011-02-14 06:00:00 GMT, et le formatter de date est aaaa-MM-jj hh: mm: ss a, donc je ne sais pas pourquoi cela ne fonctionnera pas.

+0

Comment vous remplissez 'loadArray'? – vikingosegundo

+0

Directement à partir d'un fichier, il s'agit de [NSMutableArray arrayWithContentsOfFile: [self saveFilePath]] – Nicholas1024

+0

NSLog la valeur de [loadArray objectAtIndex: 3] avant la ligne dateFromString. Aussi NSLog la valeur de myDrug.date1 avant les composants: fromDate: line. Que montrent les NSLogs? – Anna

Répondre

1

Si les chaînes de date dans loadArray sont de la forme 2011-02-14 06:00:00 GMT, le format doit être défini comme suit:

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"yyyy-MM-dd HH:mm:ss zzz"];      <-- 
date1 = [[df dateFromString:[loadArray objectAtIndex:3]] retain]; 
    // the retain above is suspicious btw (but that's another question) 
[df release]; //don't forget this 

J'ai aussi changé le hh-HH en supposant que les heures sont en fait en 24 heures au lieu de format 12 heures. Voir Unicode Date Format Patterns pour plus de détails.

Ensuite, lors de l'affichage de la date, si vous voulez afficher les heures et les minutes GMT au lieu de tout le temps actuel de l'utilisateur zone est, vous devrez régler l'heure du calendrier de la zone:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSTimeZone *tz = [NSTimeZone timeZoneWithName:@"GMT"];    <-- 
[gregorian setTimeZone:tz];          <-- 
NSDateComponents *comp = [gregorian components:NSHourCalendarUnit|NSMinuteCalendarUnit fromDate:myDrug.date1]; 
    //do not do a retain on comp above 
hourField1.text = [NSString stringWithFormat:@"%d", comp.hour]; 
minuteField1.text = [NSString stringWithFormat:@"%d", comp.minute]; 
[gregorian release]; //don't forget this 
+0

Merci pour votre aide! D'ailleurs, la retenue s'avère vraiment nécessaire, sinon je me retrouve avec un accès EXC_bad plus tard. – Nicholas1024

Questions connexes