iOS RestKit Date parsing

Dans un ancien projet iOS, je devais parsingr les dates au format dd/MM/yyyy donc j'ai mis ces lignes dans une méthode statique de mon AppDelegate et cela a fonctionné comme prévu

 // Set the Dateformatter for the Dates returned by Knowledge tt/mm/yyyy NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"dd/MM/yyyy"]; [[RKValueTransformer defaultValueTransformer] insertValueTransformer:dateFormatter atIndex:0]; 

Cependant dans les projets réels mes dates viennent dans un format légèrement différent dd.MM.yyyy , ainsi j'ai employé les mêmes lignes de code, juste changé le format de date, mais la date n'est pas analysée.

Pour cette date "ExamDate":"20.06.2014" je reçois (NSDate *) _examDate = 0x08f7dcd0 2014-01-01 01:00:00 CET après parsing et je ne peux pas comprendre pourquoi.

Mise à jour: j'ai fait un petit test avec ce code:

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"dd.MM.yyyy"]; NSDate *date = [dateFormatter dateFromSsortingng:@"20.06.2014"]; DLog(@"Date: %@", date); 

et a eu dans le journal: Date: 2014-06-19 22:00:00 +0000

Il ressemble à votre dans un timezone avec un décalage GMT de -2: 00. Réglez votre timezone à 0 GMT pour l'imprimer correctement. Ce que nous faisons habituellement, c'est simplement utiliser un time unix lors de la transmission des dates afin que nous puissions éviter ce genre de problème.

 dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; 

Puisque votre problème semble être dans l'parsing de RestKit, vous devrez utiliser votre propre parsingur de date. Vous pouvez le faire en installant ce que RestKit appelle un Transformateur de valeur, ce qu'il utilise lors du mappage des données.

En voici une avec laquelle vous pouvez travailler pour réaliser ce que vous voulez:

 [RKObjectMapping alloc]; // This ensures you will actually insert at index 0! [RKValueTransformer.defaultValueTransformer insertValueTransformer: [RKBlockValueTransformer valueTransformerWithValidationBlock:^BOOL(__unsafe_unretained Class inputValueClass, __unsafe_unretained Class outputValueClass) { return (([inputValueClass isSubclassOfClass:[NSDate class]] && [outputValueClass isSubclassOfClass:[NSSsortingng class]]) || ([inputValueClass isSubclassOfClass:[NSSsortingng class]] && [outputValueClass isSubclassOfClass:[NSDate class]])); } transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, __unsafe_unretained Class outputClass, NSError *__autoreleasing *error) { RKValueTransformerTestInputValueIsKindOfClass(inputValue, (@[ [NSSsortingng class], [NSDate class] ]), error); RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputClass, (@[ [NSSsortingng class], [NSDate class] ]), error); if ([inputValue isKindOfClass:[NSSsortingng class]]) { // We're mapping from a ssortingng to a date. // You can add your formatter here. // Below is mine for mapping from Unix Time to an NSDate. NSSsortingng* input = inputValue; *outputValue = [NSDate dateWithTimeIntervalSince1970:input.integerValue]; } else if ([inputValue isKindOfClass:[NSDate class]]) { // We're mapping from a date to a ssortingng. // You can add your formatter here (if needed). // Below is mine for mapping from an NSDate to Unix Time. NSDate* input = inputValue; *outputValue = @([input timeIntervalSince1970]); } return YES; }] atIndex:0]; // Insert at index 0 so your formatter is always used over the default one. 

Alternativement, il semble que RestKit possède sa propre catégorie NSDateFormatter qui ajoute le support pour l'append en tant que RKValueTransformer. Vous devriez pouvoir essayer quelque chose comme ceci:

 [RKObjectMapping alloc]; // This ensures you will actually insert at index 0! NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"dd.MM.yyyy"]; dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; [RKDefaultValueTransformer insertValueTransformer:dateFormatter atIndex:0];