博客
关于我
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/

你可能感兴趣的文章
OAuth2.0_授权服务配置_客户端详情配置_Spring Security OAuth2.0认证授权---springcloud工作笔记142
查看>>
OAuth2.0_授权服务配置_密码模式及其他模式_Spring Security OAuth2.0认证授权---springcloud工作笔记145
查看>>
OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
查看>>
OAuth2.0_环境介绍_授权服务和资源服务_Spring Security OAuth2.0认证授权---springcloud工作笔记138
查看>>
OAuth2.0_环境搭建_Spring Security OAuth2.0认证授权---springcloud工作笔记139
查看>>
oauth2.0协议介绍,核心概念和角色,工作流程,概念和用途
查看>>
OAuth2授权码模式详细流程(一)——站在OAuth2设计者的角度来理解code
查看>>
OAuth2:项目演示-模拟微信授权登录京东
查看>>
OA系统多少钱?OA办公系统中的价格选型
查看>>
OA系统选型:选择好的工作流引擎
查看>>
OA让企业业务流程管理科学有“据”
查看>>
OA项目之我的会议(会议排座&送审)
查看>>
OA项目之我的会议(查询)
查看>>
Object c将一个double值转换为时间格式
查看>>
object detection之Win10配置
查看>>
object detection训练自己数据
查看>>
object detection错误Message type "object_detection.protos.SsdFeatureExtractor" has no field named "bat
查看>>
object detection错误之Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
查看>>
object detection错误之no module named nets
查看>>
Object of type 'ndarray' is not JSON serializable
查看>>