最近开发过程中与别的部门对接时,model中有个字段传给我的是NSDate类型,为了便于RN处理我直接用第三方YYModel转化model to NSDictionary,这一步比较简单,不做过多说明,直接上代码:
NSDictionary *modelDict = [model yy_modelToJSONObject];
NSDate通过YYModel转化成日期字符串2019-05-22T13:20:55+0800
,RN层直接new Date(2019-05-22T13:20:55+0800)
,然而发现转发的日期不正确,这个一下就蒙了,首先想到的是native层直接把日期转化成时间戳到RN,然而老大不让啊,本着不懂的时间就要搞明白的心态,也想找下这个原因到底是为什么,通过各种查到发现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()
方法发现还真的只是替换第一个,又被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;
}
写好还沾沾自喜,感觉自己挺厉害的,就这样代码运行了几个月,忽然老板去了美国,发现app运行不起来了,到处查原因才发现,这个日期的出来有问题,这是想到了我对-
和T
的替换,手机抓紧切时区,打印发现YYModel处理后返回的日期字符串为2019-05-22T13:20:55-0700
,完全没考虑的把后面的-
也替换成了/
,就这样报错了,事后总结了一下自己犯下的这个严重的错误的原因是压根没有理解2019-05-22T13:20:55-0700
里面每个字母数字的真实含义,还自以为是的以为自己搞的很完美。
后来仔细查了一下,T
代表后面跟着是时间,-0700
和+0800
分别代表的是西七区和东八区,我把-
替换成了/
, 完全就错了。
RN和Native遇到NSDate时,由于格式的不一致,一定要写成时间戳相互传,而不能自以为是的认为RN和Native一定有相同的日期处理(自以为日期很常见,各种语言的处理都一样),避免入坑