最近開發(fā)過程中與別的部門對接時驻啤,model中有個字段傳給我的是NSDate類型,為了便于RN處理我直接用第三方Y(jié)YModel轉(zhuǎn)化model to NSDictionary脚乡,這一步比較簡單埂淮,不做過多說明,直接上代碼:
NSDictionary *modelDict = [model yy_modelToJSONObject];
NSDate通過YYModel轉(zhuǎn)化成日期字符串2019-05-22T13:20:55+0800
莱坎,RN層直接new Date(2019-05-22T13:20:55+0800)
,然而發(fā)現(xiàn)轉(zhuǎn)發(fā)的日期不正確寸士,這個一下就蒙了檐什,首先想到的是native層直接把日期轉(zhuǎn)化成時間戳到RN,然而老大不讓啊弱卡,本著不懂的時間就要搞明白的心態(tài)乃正,也想找下這個原因到底是為什么,通過各種查到發(fā)現(xiàn)RN是不支持-
和T
的婶博,要把-
換成/
瓮具,T
換成空格就ok了,于是高高興興的就寫代碼替換了凡人,代碼如下:
export function getDateStrByNativeDateStr(date) {
if (!date) {
return null;
}
if (date.indexOf('-') >= 0) {
date = date.replace('-', '/');
}
if (date.indexOf('T') >= 0) {
date = date.replace('T', ' ');
}
return date;
}
看似如此完美名党,然鵝,一運行挠轴,RN又華麗麗的跟我挖了個坑date.replace('-', '/')
只能替換第一個-
, 查寫replace()
方法發(fā)現(xiàn)還真的只是替換第一個传睹,又被RN好好的坑了一次,一想這個不難的岸晦,把所有的-
一起替換一下唄欧啤,直接貼代碼:
export function getDateStrByNativeDateStr(date) {
if (!date) {
return null;
}
while (date.indexOf('-') >= 0) {
date = date.replace('-', '/');
}
if (date.indexOf('T') >= 0) {
date = date.replace('T', ' ');
}
return date;
}
寫好還沾沾自喜,感覺自己挺厲害的委煤,就這樣代碼運行了幾個月堂油,忽然老板去了美國修档,發(fā)現(xiàn)app運行不起來了碧绞,到處查原因才發(fā)現(xiàn),這個日期的出來有問題吱窝,這是想到了我對-
和T
的替換讥邻,手機抓緊切時區(qū)迫靖,打印發(fā)現(xiàn)YYModel處理后返回的日期字符串為2019-05-22T13:20:55-0700
,完全沒考慮的把后面的-
也替換成了/
兴使,就這樣報錯了系宜,事后總結(jié)了一下自己犯下的這個嚴重的錯誤的原因是壓根沒有理解2019-05-22T13:20:55-0700
里面每個字母數(shù)字的真實含義,還自以為是的以為自己搞的很完美发魄。
后來仔細查了一下盹牧,T
代表后面跟著是時間,-0700
和+0800
分別代表的是西七區(qū)和東八區(qū)励幼,我把-
替換成了/
, 完全就錯了汰寓。
RN和Native遇到NSDate時,由于格式的不一致苹粟,一定要寫成時間戳相互傳有滑,而不能自以為是的認為RN和Native一定有相同的日期處理(自以為日期很常見,各種語言的處理都一樣)嵌削,避免入坑