今天一大早公司客服就反饋了一個(gè)問題,客戶端的時(shí)間出現(xiàn)了一個(gè)很詭異的問題:過期的券顯示過期時(shí)間是2018-12-31悟泵。2018年才過了一天港华,而且還是已經(jīng)過期的脾歇,應(yīng)該是2017才對(duì)刻蟹。
通過debug發(fā)現(xiàn)逗旁,服務(wù)端傳的時(shí)間戳是沒問題的,那就只能是客戶端時(shí)間戳轉(zhuǎn)換的問題了舆瘪∑В可是換了幾個(gè)時(shí)間戳都沒問題,實(shí)驗(yàn)了一下1483146000(2016-12-31 09:00:00)和1546218000(2018-12-31 09:00:00)時(shí)間戳之后英古,發(fā)現(xiàn)1546218000這個(gè)時(shí)間戳也出現(xiàn)了同樣的問題淀衣。檢查代碼發(fā)現(xiàn)時(shí)間戳的轉(zhuǎn)換方法沒有任何問題,然后查了官方文檔召调,官方文檔給的demo是這樣的:
RFC3339DateFormatter = [[NSDateFormatter alloc] init];
RFC3339DateFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
RFC3339DateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZZZZZ";
RFC3339DateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
(https://developer.apple.com/documentation/foundation/nsdateformatter?language=objc)
對(duì)比發(fā)現(xiàn)我們客戶端設(shè)置formatter的格式是使用的是‘YYYY-MM-dd HH:mm:ss’膨桥,在year轉(zhuǎn)換時(shí),用的是‘YYYY’某残,官方文檔用的‘yyyy’国撵,然后我就將大寫改為小寫試了一下陵吸,然后問題就解決了玻墅。
也就是說問題在year轉(zhuǎn)換時(shí)出的問題,Google了一下壮虫,發(fā)現(xiàn)iOS確實(shí)有這方面的問題澳厢,解釋是這么說的:
YYYY是以周來計(jì)算年的环础,意思是當(dāng)天所在周屬于的年份,一周從周日開始算計(jì)算剩拢,周六結(jié)束线得,只要本周跨年,那么這一周就算下一年的徐伐。
也就是說:年份如果用Y會(huì)是這周的年份贯钩,y才是標(biāo)準(zhǔn)的年份。
這一點(diǎn)官方文檔沒說明办素,所以還是自己注意點(diǎn)吧角雷,以后轉(zhuǎn)換日期格式的時(shí)候記得還是用@“yyyy-MM-dd”這種格式吧,避免出現(xiàn)這種情況衍生的bug性穿。
使用NSDateFormatter轉(zhuǎn)換時(shí)間格式勺三,需要的參數(shù)如下:
G: 公元時(shí)代,例如AD公元
yy: 年的后2位
yyyy: 完整年
MM: 月需曾,顯示為1-12
MMM: 月吗坚,顯示為英文月份簡寫,如 Jan
MMMM: 月,顯示為英文月份全稱呆万,如 Janualy
dd: 日商源,2位數(shù)表示,如02
d: 日谋减,1-2位顯示炊汹,如 2
EEE: 簡寫星期幾,如Sun
EEEE: 全寫星期幾逃顶,如Sunday
aa: 上下午讨便,AM/PM
H: 時(shí),24小時(shí)制以政,0-23
K:時(shí)霸褒,12小時(shí)制,0-11
m: 分盈蛮,1-2位
mm: 分废菱,2位
s: 秒,1-2位
ss: 秒抖誉,2位
S: 毫秒
常用日期結(jié)構(gòu):
yyyy-MM-dd HH:mm:ss.SSS
yyyy-MM-dd HH:mm:ss
yyyy-MM-dd
MM dd yyyy