前言
手機(jī)系統(tǒng)升級(jí)到iOS 15.4之后,UI顯示日期會(huì)出現(xiàn)問(wè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-06-25 17:45:22
iOS 15.4輸出:
2022-06-25 下午5:45:22
解決辦法
-
OC:
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)
備注:
蘋(píng)果官方推薦使用en_US_POSIX
為何使用 zh_Hans_CN 而不是 en_US 或者 [NSLocale systemLocale] 呢?
是因?yàn)槲覀兪褂谩癊E”來(lái)獲取中文星期信息。例如“周一”等。如果是英文或systemLocale,則會(huì)返回Mon。
日期會(huì)出現(xiàn)問(wèn)題的原因,可參考:https://developer.apple.com/library/archive/qa/qa1480/_index.html
問(wèn):我正在使用NSDateFormatter來(lái)解析Internet樣式的日期,但是對(duì)于某些地區(qū)的某些用戶來(lái)說(shuō)這會(huì)失敗。 我已經(jīng)設(shè)置了一個(gè)特定的日期格式字符串; 這不應(yīng)該強(qiáng)制NSDateFormatter獨(dú)立于用戶的區(qū)域設(shè)置工作嗎?
答:不可以。
雖然設(shè)置日期格式字符串似乎對(duì)大多數(shù)用戶都有效,但這并不是解決此問(wèn)題的正確方法。格式字符串在許多地方以意想不到的方式表現(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è)置(通過(guò)設(shè)置 > 常規(guī) > 日期和時(shí)間 > 24 小時(shí)時(shí)間),這會(huì)導(dǎo)致NSDateFormatter重寫(xiě)您設(shè)置的格式字符串,這可能會(huì)導(dǎo)致您的時(shí)間解析失敗。
……
如果您使用的是固定格式的日期……選擇的最佳語(yǔ)言環(huán)境是en_US_POSIX,這是一種專門設(shè)計(jì)用于生成美國(guó)英語(yǔ)結(jié)果的語(yǔ)言環(huán)境……