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
(无论如何您都应该设置它)解决了这个问题。
在 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
(无论如何您都应该设置它)解决了这个问题。