博客
关于我
NSDateFormatter的替代方法
阅读量:799 次
发布时间:2023-02-17

本文共 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/

你可能感兴趣的文章
Objective-C实现geometric series几何系列算法(附完整源码)
查看>>
Objective-C实现getline函数功能(附完整源码)
查看>>
Objective-C实现gnome sortt侏儒排序算法(附完整源码)
查看>>
Objective-C实现graph list图列算法(附完整源码)
查看>>
Objective-C实现GraphEdge图边算法(附完整源码)
查看>>
Objective-C实现GraphVertex图顶点算法(附完整源码)
查看>>
Objective-C实现greatest common divisor最大公约数算法(附完整源码)
查看>>
Objective-C实现greedy coin change贪心硬币找零算法(附完整源码)
查看>>
Objective-C实现greedy knapsack贪婪的背包算法(附完整源码)
查看>>
Objective-C实现GridGet算法(附完整源码)
查看>>
Objective-C实现half adder半加器算法(附完整源码)
查看>>
Objective-C实现hamiltonianCycle哈密尔顿图算法(附完整源码)
查看>>
Objective-C实现hamming code汉明码算法(附完整源码)
查看>>
Objective-C实现hamming numbers汉明数算法(附完整源码)
查看>>
Objective-C实现hammingDistance汉明距离算法(附完整源码)
查看>>
Objective-C实现hanning 窗(附完整源码)
查看>>
Objective-C实现hanoiTower汉诺塔算法(附完整源码)
查看>>
Objective-C实现hardy ramanujana定理算法(附完整源码)
查看>>
Objective-C实现harmonic series调和级数算法(附完整源码)
查看>>
Objective-C实现harris算法(附完整源码)
查看>>