看起来locale
setter有一些魔力,迫使dateFormatter
正常工作
+(NSDate*)dateTimeFromJSONDateString:(NSString*)dateString{ //dateString i.e. 2013-11-19T12:47:38+04:00
static NSDateFormatter *kDateFormatter;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
kDateFormatter = [[NSDateFormatter alloc] init];
// kDateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"ru_RU"];
[kDateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZ"];
});
NSLog(@"%@", kDateFormatter.locale.localeIdentifier); // this one prints 'ru_RU' always either I set kDateFormatter.locale explicitly or not
return [kDateFormatter dateFromString:dateString];
}
所以当第6行被注释时,此方法返回nil
,否则返回正确的日期。
我做错了什么,或者我们在这里有sdk错误?
答案 0 :(得分:3)
通过将格式化程序的区域设置设置为en_US_POSIX
来解决问题。解析固定格式的日期字符串时是必要的,因为日期字符串的格式与设备的语言环境不同。
代码应该像
+(NSDate*)dateTimeFromJSONDateString:(NSString*)dateString{
static NSDateFormatter *_dateFormatter;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_dateFormatter = [[NSDateFormatter alloc] init];
_dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
[_dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZ"];
});
if (string)
return [_dateFormatter dateFromString:string];
else
return nil;
}
答案 1 :(得分:0)
我不知道它是否已被记录或是一个错误,但在iOS 7(或XCode 5中,不确定问题的根源)你必须在解析日期字符串之前设置NSDateFormatter的显式语言环境,或者你得到零日期
在XCode 5 / iOS 7之前,NSDateFormatter默认使用手机的语言环境,而你没有获得零日期
我发现了这个问题,它保留了旧的应用程序,突然开始返回无日期