Cocoa中NSString到NSDate的处理

Cocoa中NSString到NSDate的处理,第1张

概述http://lianxu.me/blog/2012/03/14/speed-up-nsdateformatter/ NSDate是NS类库中基础类型之一。随着数字化发展,程序对数据处理量越来越大,我们经常从服务器取得的日期是字符串序列,格式化为正确的date类型是一个不可避免的工作。在Cocoa程序里提供了非常方便的函数和类,但是仍然需要我们了解一些技巧。尤其是当我们的程序面对大量的日期字符串转

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可以提高速度很多。

91011121314151617181920212223242526272829303132333435363738394041424344454647484950
NSDate*)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代码格式化时间字符串。如下代码经过测试是最快的。

11
struct 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次解析日期字符串的时间比较。

3
2012-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的处理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1058543.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-25
下一篇2022-05-25

发表评论

登录后才能评论

评论列表(0条)

    保存