
http://lianxu.me/blog/2012/03/14/speed-up-nsdateformatter/
NSDate是NS类库中基础类型之一。随着数字化发展,程序对数据处理量越来越大,我们经常从服务器取得的日期是字符串序列,格式化为正确的date类型是一个不可避免的工作。在Cocoa程序里提供了非常方便的函数和类,但是仍然需要我们了解一些技巧。尤其是当我们的程序面对大量的日期字符串转换的时候,要格外的注意。苹果文档中使用NSDateFormatter类格式化日期字符串,但是以防读者不知道,我这里提一下:它的速度非常慢!!这篇文章介绍如何处理这种情况。
123456789 | - (NSDate *)dateFromString:(Nsstring *)string { //Wed Mar 14 16:40:08 +0800 2012 if (!string) return nil; NSDateFormatter *dateformatter=dateformatter = [[NSDateFormatter alloc] init]; NSTimeZone *tz = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; [dateformatter setTimeZone:tz]; [setDateFormat:@"EEE MMM dd HH:mm:ss Z yyyy"];; return [dateFromString:string]; } |
由于NSDateFormatter内部代码原因,所以格式化字符串代价很大。对于个别地方使用它做日期转换是非常方便的,但是如果是放在一个大的循环内部,直接使用NSDateFormatter绝对不是明智的选择。它很有可能成为拖慢你程序速度的元凶。
其实如果你知道你的程序将会取得什么格式的日期字符串,那么直接分解字符串后利用NSCalendar和NSDateComponents可以提高速度很多。
91011121314151617181920212223242526272829303132333435363738394041424344454647484950NSDate*)mydateFromString:(string; { nil; static NSCalendar *gregorian=NSDateComponents *comps=NSDictionary *month=if (gregorian==nil) { gregorian = [[NSCalendar alloc] initWithCalendarIDentifIEr:NSGregorianCalendar]; comps = [[NSDateComponents month = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:1], @"Jan", [2],152)!important">@"Feb",152)!important">3],152)!important">@"Mar",152)!important">4],152)!important">@"Apr",152)!important">5],152)!important">@"May",152)!important">6],152)!important">@"Jun",152)!important">7],152)!important">@"Jul",152)!important">8],152)!important">@"Aug",152)!important">9],152)!important">@"Sep",152)!important">10],152)!important">@"Oct",152)!important">11],152)!important">@"Nov",152)!important">12],152)!important">@"Dec", nil]; } @try { Nsstring *t=[string substringWithRange:NSMakeRange(26, 4)]; [comps setYear:[t intValue]]; 4,152)!important">3)]; [setMonth:[[month objectForKey:t] 8,152)!important">2)]; [setDay:[11,0)!important">setHour:[14,0)!important">setMinute:[17,0)!important">setSecond:[20,152)!important">5)]; //全球共24个标准时区,每个时区为1个小时,下面计算该时区offset秒数 [setTimeZone:[timeZoneForSecondsFromGMT:[intValue]/100*3600]]; } @catch (NSException *exception) { } @finally { } gregorian dateFromComponents:comps]; } 如果要更快,就需要抛弃ObjC,编写c代码格式化时间字符串。如下代码经过测试是最快的。
11struct tm tm; time_t t; string=[substringFromIndex:4]; strptime([cStringUsingEnCoding:NSUTF8StringEnCoding],152)!important">"%b %d %H:%M:%s %z %Y", &tm); tm.tm_isdst = -1; t = mktime(&tm); NSDate dateWithTimeIntervalSince1970:t]; } 下面是我简单测试循环10000次解析日期字符串的时间比较。
32012-05-05 15:57:51.942 timetest[18488:707] 1.991521 //第一种 52.096 0.921144 //第二种 54.088 0.153897//第三种 最后作为参考资料,说明一下 OSX 10.6 下 NSDateFormatter 使用 Unicode Locale Data MarkuP Language (LDML) version tr35-10 标准。作为标准文档,Apple是不会全部写到开发文档里的,不明白的同学可以到这查看。
总结以上是内存溢出为你收集整理的Cocoa中NSString到NSDate的处理全部内容,希望文章能够帮你解决Cocoa中NSString到NSDate的处理所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)