48 votes

Comment analyser une chaîne de date dans un objet NSDate dans iOS?

Je suis en train d'analyser une chaîne de date de xml dans un objet NSDate dans une application iPhone

Je suis conscient que cela doit avoir été demandé avant, cependant, je crois que j'ai le droit de syntaxe, mais ça ne fonctionne pas. Est-il un problème avec mon code?

La chaîne de date j'ai besoin d'analyser est:

2011-01-21T12:26:47-05:00

Le code que j'utilise analyser c'est:

self.dateFormatter = [[NSDateFormatter alloc] init];
    [self.dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    [self.dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
    [self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];



... 

else if([elementName isEqualToString:kUpdated]){
    self.currentQuestion.updated = [self.dateFormatter dateFromString:self.currentParsedCharacterData ];
}

Toute aide grandement appréciée. Merci!

**Basé sur le lien de référence à partir de theChrisKent j'ai résolu le problème comme ceci:

else if([elementName isEqualToString:kLastOnDeck]){

    NSString *dateStr = self.currentParsedCharacterData;
    // we need to strip out the single colon
    dateStr = [dateStr stringByReplacingOccurrencesOfString:@":" 
                                                 withString:@"" 
                                                    options:0 
                                                      range:NSMakeRange([dateStr length] - 5,5)];




    self.currentQuestion.lastOnDeck = [dateFormatter dateFromString:dateStr];

}

64voto

theChrisKent Points 10963

Vous n'avez pas besoin de près d'autant de guillemets simples comme vous l'avez (nécessaire seulement sur la non date/heure de caractères), afin de changer ce:

[self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];

Pour cela:

[self.dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];
...
self.currentQuestion.updated = [self.dateFormatter dateFromString:[self.currentParsedCharacterData stringByReplacingOccurrencesOfString:@":" withString:@"" options:0 range:NSMakeRange([self.currentParsedCharacterData length] – 5,5)]];

La Documentation ici: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW1

Format Unicode Modèles: http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns

Traiter avec les fuseaux horaires avec des points (+00:00): http://petersteinberger.com/2010/05/nsdateformatter-and-0000-parsing/

3voto

Anurag Points 66470

J'avais les mêmes problèmes avec le côlon à la fin. Voici une fonction que j'avais l'habitude de normaliser pour rendre heureux NSDate .

 /**
 * Timezones are returned to us in the format +nn:nn
 * The date formatter currently does not support IS 8601 dates, so
 * we convert timezone from the format "+07:30" to "+0730" (removing the colon) which
 * can then be parsed properly.
 */
- (NSString *)applyTimezoneFixForDate:(NSString *)date {
    NSRange colonRange = [date rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@":"] options:NSBackwardsSearch];
    return [date stringByReplacingCharactersInRange:colonRange withString:@""];
}
 

1voto

Badre Points 74

Les solutions, c'est changer:

 [self.dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
 

À cette notation:

 [self.dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
 

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X