iOS NSDateFormatter甚至需要NSLocale';协调世界时

iOS NSDateFormatter甚至需要NSLocale';协调世界时,ios,nsdate,nsdateformatter,nstimezone,nslocale,Ios,Nsdate,Nsdateformatter,Nstimezone,Nslocale,我有一个疑问,我无法理解为什么是这样,我呼吁这个网站的神:) 我的约会是这样的: "1982-01-01T00:00:00Z" 当我显示服务器发送的任何内容时(我知道,客户要求,不是良好实践…),我强制设备使用以下方法设置时区,简化而不检查错误,不优化,以及诸如此类的内容: + (NSString *) yearStringFromDate: (NSDate *) date { NSDateFormatter *formatter = [NSDateFormatter new];

我有一个疑问,我无法理解为什么是这样,我呼吁这个网站的神:)

我的约会是这样的:

"1982-01-01T00:00:00Z" 
当我显示服务器发送的任何内容时(我知道,客户要求,不是良好实践…),我强制设备使用以下方法设置时区,简化而不检查错误,不优化,以及诸如此类的内容:

+ (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)在真实的设备和模拟器中进行测试

  • 为什么会这样
  • 为什么即使时区正确,区域设置也会影响日期
  • 为什么有时候是在约会,有时候不是? 例如,1982在没有设置区域设置的情况下返回,1981,如果我将其设置为1982。1980年不会出现这种情况,1980年(或1987年,或……)和1980年都会出现这种情况
提前感谢您的回复:D
干杯

使用
yyyy
而不是
yyy


。看

不过,在您的示例中,您正试图从日期对象获取年份字符串表示形式。在这种情况下,您可能不需要
en\u US\u POSIX
。只有当您需要使用公历时,才需要这样做,无论设备当前使用的是哪种日历

不过,正如其他人所指出的,您应该使用
yyyy
,而不是
yyy
。前者返回日历年。后者以基于“一年中的一周”的日历返回年份,其值可能并不总是与日历年相同

有关对比
y
y
的讨论,请参见


顺便说一下,如果您确实需要日期的年份部分,还可以使用
NSCalendar
NSDateComponents
相关方法

谢谢你的评论,罗布。解释得很好!非常感谢。真棒的回答。