2010-02-28 12 views
6

J'ai lu le guide DateFormatting et je n'arrive toujours pas à obtenir un formateur fonctionnel.NSDate from NSString

NSString *string = @"0901Z 12/17/09"; 
//This is a sample date. The Z stands for GMT timezone 
//The 0901 is 09h 01m on a 24 hour clock not 12. 
//As long as I can get the hours/min & date from the string I can deal with the time zone later 
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"hhmm'Z' MM/dd/yy"]; 
NSDate *date = [dateFormat dateFromString:string]; 

Répondre

7

Cela fonctionne pour moi quand je l'essaye. Ajout NSLog(@"%@", date) à la fin de votre code me donne cette sortie:

2010-02-28 12:17:22.921 app[9204:a0f] 2009-12-17 09:01:00 -0800 

Quel est le problème que vous voyez?

Edit: Je l'ai compris, vous n'avez pas de problème avec 09:01, mais avec d'autres heures de 24 heures, comme 14:25, non? Changez votre formatter à:

@"HHmm'Z' MM/dd/yy" 
+0

C'était la chose 24 heures me faire apparemment. Merci. – jamone

1

Copié d'une question similaire, je répondais ici: NSDateFormatter returns nil for @"dd-MM-yy" in iOS 3.0

Si vous travaillez avec des dates visibles par l'utilisateur, vous devez éviter de créer une chaîne de format de date. La mise en forme de dates de cette manière n'est pas localisable et rend impossible la prédiction de l'expression de votre chaîne de format dans toutes les configurations utilisateur possibles. Vous devriez plutôt essayer de vous limiter à la définition de styles de date et d'heure (via - [NSDateFormatter setDateStyle:] et - [NSDateFormatter setTimeStyle:]). D'autre part, si vous travaillez avec des dates au format fixe, vous devez d'abord définir les paramètres régionaux du formateur de date sur quelque chose de approprié pour votre format fixe. Dans la plupart des cas, le meilleur paramètre à choisir est «en_US_POSIX», un environnement local spécialement conçu pour générer des résultats en anglais américain, indépendamment des préférences de l'utilisateur et du système. "en_US_POSIX" est également invariant dans le temps (si les Etats-Unis, à un moment donné, modifient la façon dont il formate les dates, "en_US" changera pour refléter le nouveau comportement, mais "en_US_POSIX" ne le sera pas) et entre machines ("en_US_POSIX" fonctionne de la même manière sur iPhone OS que sur Mac OS X, comme sur d'autres plateformes). Une fois que vous avez défini "en_US_POSIX" comme paramètres régionaux du formateur de date, vous pouvez définir la chaîne de format de date et le formateur de date se comportera de manière cohérente pour tous les utilisateurs.

Les informations ci-dessus et d'autres se trouvent dans Technical Q&A QA1480 Apple

Voici un extrait de code de mon application qui met en œuvre la recommandation ci-dessus:

static NSDateFormatter* dateFormatter = nil; 
if (!dateFormatter) { 
dateFormatter = [[NSDateFormatter alloc] init]; 
NSLocale *enUSPOSIXLocale = [[[NSLocale alloc] 
      initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]; 
NSAssert(enUSPOSIXLocale != nil, @"POSIX may not be nil."); 
[dateFormatter setLocale:enUSPOSIXLocale]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

dateFormatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss +0000"; 
}