NSDateFormatter和默认语言环境导致错误

时间:2014-04-30 23:00:11

标签: ios nsdateformatter nslocale

看起来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错误?

2 个答案:

答案 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默认使用手机的语言环境,而你没有获得零日期

我发现了这个问题,它保留了旧的应用程序,突然开始返回无日期