iPadOS 13 到 14 的 NSDateFormatter 输出差异

NSDateFormatter output difference from iPadOS 13 to 14

在 iPadOS 13 日,当用户将“24 小时制”设置为 FALSE 时,以下代码将产生以下输出:

代码:

+ (NSString *)dateStringFromDate:(NSDate *)date {
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
    return [dateFormatter stringFromDate:date];
}

输出:

2020-10-19T11:55:29Z

但是,在 iPadOS 14,相同的代码会产生以下输出:

2020-10-19T12:38:06 p.m.Z

注意:24 小时时间切换在两个操作系统上都设置为 FALSE。出于某种原因,iPadOS 14 似乎尊重 NSDateFormatter 中的 AM/PM 设置,但 iPadOS 13 不是。

我知道将区域设置为此将完全删除 AM/PM:

dateFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];

但是,当 iPad 设置完全相同时,我们正在尝试理解为什么问题只出现在 iPadOS 14 而不是 13。

Foundation 的日期和时间 API 建立在 Apple 平台附带的 ICU 版本之上。在 OS 个版本之间,Foundation 和 ICU 代码都会收到更新,修复旧错误,偶尔会引入新错误。在任何 API 层,此处的更改已经显现(以及这是否被视为该层的错误),您将看到代码已更改的结果。

这里的行为看起来不对,但幸运的是,区域设置 en_US_POSIX(无论如何您都应该设置它)解决了这个问题。