【问题标题】:NSDateFormatter: dateFromString returns nil [duplicate]NSDateFormatter:dateFromString 返回 nil [重复]
【发布时间】:2016-04-15 13:40:55
【问题描述】:

我有以下格式的日期:

    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);

日志:

    2016-02-15 06:36:47.496 App[46714:5560483] date : (null)

我什至尝试过:

    [dateFormat setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]

但无济于事。

【问题讨论】:

标签: ios objective-c nsdate nsdateformatter


【解决方案1】:

设置日期格式为

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

更新

    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);

输出

【讨论】:

  • 检查更新的答案
  • 反对者可以在这里解释问题所在
  • 不确定是谁投了你的反对票 - 抱歉。但我支持你,所以你不会受到打击。
  • @user1107173 -- 没关系,兄弟,我的回答是否有希望
  • @trojanfoe - 不是那样的,我们知道你,你总是很好
【解决方案2】:

试试这个功能:

 +(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;
}

【讨论】:

  • 不提供年份。
  • 所以您只需要输入年份?
【解决方案3】:

格式:

yyyy

与日期字符串不匹配:

1996-08-09T07:00:00Z

因此[NSDateFormatter dateFromString:] 返回nil

你想要这种格式:

yyyy-MM-dd'T'HH:mm:ssZ

(注意X 说明符是documentedZ(祖鲁时间)的正确说明符,但是在与@rmaddy 的讨论中,他让我相信Z 是正确的使用说明符。 )

然后使用NSDateComponents提取年份。

【讨论】:

  • 不确定是谁投了你的反对票 - 抱歉。但我支持你,所以你不会受到打击。
  • 不要在日期格式中引用Z。日期字符串中的Z 表示字符串的时区。如果您以日期格式引用 Z,格式化程序将忽略 Z 并将日期字符串解释为本地时间而不是 UTC 时间。
  • @rmaddy 未引用的Z 说明符不是documented 来处理Z 的输入字符(意思是zulu 时间)。它支持 -0800、GMT-8:00、-08:00 或 -07:52:58,具体取决于您指定的 Zs 数量。但是,看起来 X 确实如此。
  • 我刚刚进行了 100% 的测试(我之前只有 99.5% 的把握),我是正确的。 Z 格式说明符将 Z 时区代码正确处理为 UTC 时间。
  • @rmaddy 我很高兴接受这一点,但是文档似乎不正确(或 Apple 的实现)有点烦人。无论如何感谢您的更正。
猜你喜欢
  • 2016-09-04
  • 1970-01-01
  • 2019-10-12
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
相关资源
最近更新 更多