【问题标题】:iOS NSDateFormatter needs NSLocale even it's UTCiOS NSDateFormatter 需要 NSLocale,即使它是 UTC
【发布时间】:2015-12-04 04:39:32
【问题描述】:

我怀疑我无法理解为什么会这样,我呼吁这个网站的众神:)

我有一个这样的约会:

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

  • 这是为什么呢?
  • 为什么即使时区正确,区域设置也会影响日期?
  • 为什么有时可以处理某些日期而有时不能? 例如,1982 在没有设置语言环境的情况下返回,1981 如果我将其设置为 1982。1980 不会发生这种情况,在两种情况下都会返回 1980(或 1987,或...)

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

【问题讨论】:

    标签: ios nsdate nsdateformatter nstimezone nslocale


    【解决方案1】:

    将 ISO 8601/RFC 3339 日期字符串转换为 NSDate 对象时,如果用户不使用公历,则使用 en_US_POSIX 区域设置。见Technical Q&A 1480

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

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

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

    对了,如果你真的需要日期的年份分量,也可以使用NSCalendarNSDateComponents相关方法。

    【讨论】:

    • 感谢罗布的评论。解释得很好!
    【解决方案2】:

    使用yyyy 而不是YYYY

    Reference.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      • 1970-01-01
      • 2018-10-01
      相关资源
      最近更新 更多