Ios NSDateFormatter:dateFromString返回nil

Ios NSDateFormatter:dateFromString返回nil,ios,objective-c,nsdate,nsdateformatter,Ios,Objective C,Nsdate,Nsdateformatter,我的日期格式如下: NSString *dateString = @"1996-08-09T07:00:00Z"; 我只需要从上述日期提取年份: NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setTimeZone:[NSTimeZone systemTimeZone]]; [dateFormat setLocale:[NSLocale currentLocal

我的日期格式如下:

    NSString *dateString = @"1996-08-09T07:00:00Z";
我只需要从上述日期提取年份:

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setTimeZone:[NSTimeZone systemTimeZone]];
    [dateFormat setLocale:[NSLocale currentLocale]];
    [dateFormat setDateFormat:@"yyyy"];
    [dateFormat setFormatterBehavior:NSDateFormatterBehaviorDefault];
    NSDate *date = [dateFormat dateFromString:dateString];
    NSLog(@"date : %@", date);
日志:

我甚至试过:

    [dateFormat setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]
但是没有用

格式:

yyyy
与日期字符串不匹配:

1996-08-09T07:00:00Z
因此[NSDateFormatter dateFromString:]返回了nil

您需要以下格式:

yyyy-MM-dd'T'HH:mm:ssZ
注意,X说明符是Z Zulu时间的正确说明符,但是在与@rmaddy的讨论中,他说服了我Z是正确使用的说明符

然后使用NSDateComponents提取年份。

将日期格式设置为

                            1996-08-09T07:00:00Z
[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
更新

输出

尝试此功能:

 +(NSDate *)convertUTCDateLocal:(NSString*)inputString
{
    NSString *dateFormat = @"yyyy-MM-dd'T'HH:mm:sszz";
    //for input
    NSTimeZone *inputTimeZone =[NSTimeZone timeZoneWithName:@"UTC"];
    NSDateFormatter *inputDateFormatter = [[NSDateFormatter alloc] init];
    [inputDateFormatter setTimeZone:inputTimeZone];

    //NSString *inputString = @"2015-07-31T14:00:00+0000";
    [inputDateFormatter setDateFormat:dateFormat];
    NSDate *date = [inputDateFormatter dateFromString:inputString];

    //for output
    NSDateFormatter *outputDateFormatter = [[NSDateFormatter alloc] init];
    [outputDateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
    [outputDateFormatter setLocale:[NSLocale currentLocale]];
    [outputDateFormatter setDateFormat: @"yyyy"];

    NSString *outputString = [outputDateFormatter stringFromDate:date];

    NSDate *outputDate = [outputDateFormatter dateFromString:outputString];

    return outputDate;
}

dateFormat设置为NSDateFormatter显然与DateStrings的格式不匹配这可能会有所帮助:检查更新的回答DownVorters可以解释此处的错误不确定谁给了你否决票-抱歉。但是我给了你更高的票数,所以你不会被击中。@user1107173-没关系,兄弟,在我的回答中是希望还是希望not@trojanfoe-不是这样,我们知道你,你总是很好。你不提供年份。所以你只想从输入中获得年份?不确定是谁否决了你-抱歉。但是我投了你一票,这样你就不会被点击。不要在日期格式中引用Z。日期字符串中的Z表示字符串的时区。如果在日期格式中引用Z,格式化程序将忽略Z,并将日期字符串解释为本地时间而不是UTC时间。@rmaddy未引用的Z说明符不处理表示zulu时间的输入字符。它支持-0800、GMT-8:00、-08:00或-07:52:58,具体取决于您指定的Z数。但看起来X是这样的。我刚刚做了一个100%的测试,之前我只有99.5%的把握,我是正确的。Z格式说明符正确地将Z时区代码处理为UTC时间。@rmaddy我很高兴接受这一点,但是文档似乎不正确或苹果的实现有点烦人。无论如何,谢谢你的更正。
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setTimeZone:[NSTimeZone systemTimeZone]];
[dateFormat setLocale:[NSLocale currentLocale]];
[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
[dateFormat setFormatterBehavior:NSDateFormatterBehaviorDefault];
NSDate *date = [dateFormat dateFromString:@"1996-08-09T07:00:00Z"];
NSLog(@"date : %@", date);
[dateFormat setDateFormat:@"yyyy"];
NSString *finalStr = [dateFormat stringFromDate:date];
NSLog(@"finalStr : %@", finalStr);
 +(NSDate *)convertUTCDateLocal:(NSString*)inputString
{
    NSString *dateFormat = @"yyyy-MM-dd'T'HH:mm:sszz";
    //for input
    NSTimeZone *inputTimeZone =[NSTimeZone timeZoneWithName:@"UTC"];
    NSDateFormatter *inputDateFormatter = [[NSDateFormatter alloc] init];
    [inputDateFormatter setTimeZone:inputTimeZone];

    //NSString *inputString = @"2015-07-31T14:00:00+0000";
    [inputDateFormatter setDateFormat:dateFormat];
    NSDate *date = [inputDateFormatter dateFromString:inputString];

    //for output
    NSDateFormatter *outputDateFormatter = [[NSDateFormatter alloc] init];
    [outputDateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
    [outputDateFormatter setLocale:[NSLocale currentLocale]];
    [outputDateFormatter setDateFormat: @"yyyy"];

    NSString *outputString = [outputDateFormatter stringFromDate:date];

    NSDate *outputDate = [outputDateFormatter dateFromString:outputString];

    return outputDate;
}