博客
关于我
NSDateFormatter的替代方法
阅读量:794 次
发布时间: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/

你可能感兴趣的文章
NN&DL4.8 What does this have to do with the brain?
查看>>
nnU-Net 终极指南
查看>>
No 'Access-Control-Allow-Origin' header is present on the requested resource.
查看>>
NO 157 去掉禅道访问地址中的zentao
查看>>
no available service ‘default‘ found, please make sure registry config corre seata
查看>>
no connection could be made because the target machine actively refused it.问题解决
查看>>
No Datastore Session bound to thread, and configuration does not allow creation of non-transactional
查看>>
No fallbackFactory instance of type class com.ruoyi---SpringCloud Alibaba_若依微服务框架改造---工作笔记005
查看>>
No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc
查看>>
No mapping found for HTTP request with URI [/...] in DispatcherServlet with name ...的解决方法
查看>>
No mapping found for HTTP request with URI [/logout.do] in DispatcherServlet with name 'springmvc'
查看>>
No module named 'crispy_forms'等使用pycharm开发
查看>>
No module named cv2
查看>>
No module named tensorboard.main在安装tensorboardX的时候遇到的问题
查看>>
No module named ‘MySQLdb‘错误解决No module named ‘MySQLdb‘错误解决
查看>>
No new migrations found. Your system is up-to-date.
查看>>
No qualifying bean of type XXX found for dependency XXX.
查看>>
No resource identifier found for attribute 'srcCompat' in package的解决办法
查看>>
no session found for current thread
查看>>
No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
查看>>