iOS RestKitdateparsing
在一个老的iOS项目中,我不得不parsing格式为dd/MM/yyyy
date,所以我把这些行放在我的AppDelegate的静态方法中,它按预期工作
// 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];
但是在实际的项目中,我的date格式与dd.MM.yyyy
格式略有不同,所以我使用了相同的代码行,只是切换了date格式,但date没有被parsing。
对于这个date"ExamDate":"20.06.2014"
我得到(NSDate *) _examDate = 0x08f7dcd0 2014-01-01 01:00:00 CET
parsing后,我不明白为什么。
更新:我用这个代码做了一个小testing:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"dd.MM.yyyy"]; NSDate *date = [dateFormatter dateFromString:@"20.06.2014"]; DLog(@"Date: %@", date);
并得到日志: Date: 2014-06-19 22:00:00 +0000
它看起来像是在GMT时差为-2:00的时区。 将您的时区设置为0格林威治标准时间打印正确。 我们通常做的只是使用unix时间来传递date,所以我们可以避免这种问题。
dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
由于您的问题似乎在RestKit的parsing中,您将需要使用您自己的dateparsing器。 你可以通过安装什么RestKit调用一个值转换器,这就是它在映射数据时使用的。
这里有一个你可以用来实现你想要的东西:
[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:[NSString class]]) || ([inputValueClass isSubclassOfClass:[NSString class]] && [outputValueClass isSubclassOfClass:[NSDate class]])); } transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, __unsafe_unretained Class outputClass, NSError *__autoreleasing *error) { RKValueTransformerTestInputValueIsKindOfClass(inputValue, (@[ [NSString class], [NSDate class] ]), error); RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputClass, (@[ [NSString class], [NSDate class] ]), error); if ([inputValue isKindOfClass:[NSString class]]) { // We're mapping from a string to a date. // You can add your formatter here. // Below is mine for mapping from Unix Time to an NSDate. NSString* input = inputValue; *outputValue = [NSDate dateWithTimeIntervalSince1970:input.integerValue]; } else if ([inputValue isKindOfClass:[NSDate class]]) { // We're mapping from a date to a string. // 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.
另外,它看起来像RestKit有它自己的NSDateFormatter类别,增加了它作为一个RKValueTransformer添加的支持。 你应该可以尝试这样的事情:
[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];