本文共 2514 字,大约阅读时间需要 8 分钟。
NSDateFormatter的替代方法
频繁创建、初始化NSDateFormatter来转换时间比较耗性能。下面我们来做一个实验对比两种方法的性能差异。
方法1:使用strptime方法转换时间
-(void)convertTime1:(NSString *)iso8601String{ time_t t; struct tm tm; strptime([iso8601String cStringUsingEncoding:NSUTF8StringEncoding], "%Y-%m-%d %H:%M:%S%z", &tm); tm.tm_isdst = -1; t = mktime(&tm); [NSDate dateWithTimeIntervalSince1970:t + [[NSTimeZone localTimeZone] secondsFromGMT]];} 方法2:使用NSDateFormatter转换时间
-(void)convertTime2:(NSString *)iso8601String{ NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"yyyy-MM-dd hh-mm-ss"; formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_cn"]; NSDate *date = [formatter dateFromString:iso8601String];} 将以上两个方法连个执行10000次,比较消耗的时间。测试结果显示:method 1耗时0.128860秒,method 2耗时3.319963秒。可以看出使用NSDateFormatter耗费了大量的时间。
解决方案:苹果官方建议将NSDateFormatter保存成单例,并通过懒加载优化代码结构。
优化后的代码:
-(NSDateFormatter *)formatter{ if(_formatter == nil){ _formatter = [[NSDateFormatter alloc] init]; _formatter.dateFormat = @"yyyy-MM-dd hh-mm-ss"; _formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_cn"]; } return _formatter;}-(void)convertTime1:(NSString *)iso8601String{ time_t t; struct tm tm; strptime([iso8601String cStringUsingEncoding:NSUTF8StringEncoding], "%Y-%m-%d %H:%M:%S%z", &tm); tm.tm_isdst = -1; t = mktime(&tm); [NSDate dateWithTimeIntervalSince1970:t + [[NSTimeZone localTimeZone] secondsFromGMT]];}-(void)convertTime2:(NSString *)iso8601String{ [self.formatter dateFromString:iso8601String];} 测试结果显示:method 1耗时0.128738秒,method 2耗时1.108044秒,与修改之前的结果相比,性能有所提升。
日期格式说明:%a:星期几的英语缩写(Sun, Mon, ..., Sat(en_US); So, Mo, ..., Sa(de_DE))%A:星期几的英语全称(Sunday, Monday, ..., Saturday(en_US))%w:采用数字表示,0表示星期日,6表示星期六%d:用0补充的两位日期数字(01,02,...,31)%b:月份采用缩写字符表示(Jan, Feb,..., Dec(en_US))%B:月份采用全名称表示(January, February, ...,December(en_US))%m:月份采用0补充的两位数表示(01,02,...,12)%y:年份采用0补充的两位数表示(00,01,...,99)%Y:四位数表示的年份(0001,0002,...,2013,2014,...,9998,9999)%H:以0补充的24小时表示的小时(00,01,...,23)%I:以0补充的12小时表示的小时(00,01,...,12)%p:本地时间是上午还是下午(AM,PM(en_US))%M:以0补充的分钟表示(00,01,...,59)%S:以0补充的秒表示(00,01,...,59)%f:以0补充的微秒表示(000000,000001,...,999999)%z:UTC偏移表示为+HHMM或-HHMM。(empty),+0000,-0400,+1030%Z:时区名称。(empty),UTC,EST,CST%j:以0补充的年的天数(001,002,...,366)%U:一年里第几周,星期日作为一周开始(00,01,...,53)%W:一年里第几周,星期一作为一周开始(00,01,...,53)%c:采用本地合适日期和时间表示(Tue Aug 16 21:30:00 1988(en_US))%x:采用本地合适日期表示(08/16/88(None);08/16/1988(en_US))%:输出百分号
参考资料:https://my.oschina.net/mexiaobai1315/blog/1571206
转载地址:http://eejfk.baihongyu.com/