手機(jī)系統(tǒng)升級(jí)到iOS 15.4之后,UI顯示日期會(huì)出現(xiàn)問題。
NSDate *date = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSString *dateStr = [dateFormatter stringFromDate:date];
非iOS 15.4輸出:
2022-03-28 14:51:22
iOS 15.4輸出:
2022-03-28 下午2:56:26
OBJ-C修改如下:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_Hans_CN"];
dateFormatter.calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierISO8601];
swift修改如下:
let formatter = DateFormatter()
formatter.locale = Locale.init(identifier: "zh_Hans_CN")
formatter.calendar = Calendar.init(identifier: .iso8601)
備注:
蘋果官方推薦使用en_US_POSIX
為何使用 zh_Hans_CN 而不是 en_US 或者 [NSLocale systemLocale] 呢?
是因?yàn)槲覀兪褂谩癊E”來獲取中文星期信息。例如“周一”等。如果是英文或systemLocale,則會(huì)返回"Mon"。
日期會(huì)出現(xiàn)問題的原因,可參考:https://developer.apple.com/library/archive/qa/qa1480/_index.html
問:我正在使用 NSDateFormatter 來解析 Internet 樣式的日期,但是對(duì)于某些地區(qū)的某些用戶來說這會(huì)失敗。 我已經(jīng)設(shè)置了一個(gè)特定的日期格式字符串; 這不應(yīng)該強(qiáng)制 NSDateFormatter 獨(dú)立于用戶的區(qū)域設(shè)置工作嗎?
答:不可以。
雖然設(shè)置日期格式字符串似乎對(duì)大多數(shù)用戶都有效,但這并不是解決此問題的正確方法。格式字符串在許多地方以意想不到的方式表現(xiàn)。
……
例如,在設(shè)置中如果用戶選擇佛歷,則解析年份“2010”將產(chǎn)生 1467 年的 NSDate,因?yàn)榉饸v上的 2010 年是我們?nèi)粘J褂玫模ü珰v)上的 1467 年.
在 iOS 上,用戶可以覆蓋默認(rèn)的 AM/PM 與 24 小時(shí)時(shí)間設(shè)置(通過設(shè)置 > 常規(guī) > 日期和時(shí)間 > 24 小時(shí)時(shí)間),這會(huì)導(dǎo)致 NSDateFormatter 重寫您設(shè)置的格式字符串,這可能會(huì)導(dǎo)致您的時(shí)間解析失敗。
……
如果您使用的是固定格式的日期……選擇的最佳語言環(huán)境是“en_US_POSIX”,這是一種專門設(shè)計(jì)用于生成美國英語結(jié)果的語言環(huán)境……