iOS NSDateFormatter 需要 NSLocale 即使它是 UTC

iOS NSDateFormatter needs NSLocale even it's UTC

疑惑不明白为什么会这样,求助本站大神:)

我有个约会是这样的:

"1982-01-01T00:00:00Z" 

因为我正在显示服务器发送的任何内容(我知道,客户要求,不是好的做法......),我强制设备使用以下方法拥有该 TimeZone,简化而没有错误检查,而不是优化,以及所有类似的东西:

+ (NSString *) yearStringFromDate: (NSDate *) date
{
    NSDateFormatter *formatter = [NSDateFormatter new];
    [formatter setDateFormat:@"YYYY"];
    [formatter setTimeZone:[self timezoneForSIHF]];

    return [formatter stringFromDate:date];    
}

这应该是 UTC,但如果我没有设置我得到的语言环境,有时只是不正确的年份。所以通过添加这个我得到了所有情况下正确的年份:

[formatter setLocale:[NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]];

有关更多信息,我正在使用不同语言(en、de、es)的真实设备和模拟器中进行测试。

提前感谢您的所有回复:D 干杯!

使用 yyyy 而不是 YYYY

Reference.

将 ISO 8601/RFC 3339 日期字符串转换为 NSDate 对象时,如果用户未使用公历,则使用 en_US_POSIX 语言环境。参见 Technical Q&A 1480

但是,在您的情况下,您正试图从日期对象中获取年份字符串表示形式。在那种情况下,您可能不需要 en_US_POSIX。仅当您需要使用公历时才需要这样做,而不管设备当前使用的是哪种日历。

正如其他人所指出的,您应该使用 yyyy 而不是 YYYY。前 returns 历年。后者 returns 年份,在基于 "Week of Year" 的日历中,可能并不总是与日历年的值相同。

请参阅 date formatting patterns 以了解对比 yY 的讨论。

顺便说一下,如果确实需要日期的年份成分,也可以使用NSCalendarNSDateComponents相关方法。