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

你可能感兴趣的文章
python 命令接口_实现“[命令][操作][参数]”样式的命令行接口?
查看>>
Python 和 OpenCV.如何检测图像中的所有(填充)圆形/圆形对象?
查看>>
Python 和 RabbitMQ - 聆听来自多个渠道的消费事件的最佳方式?
查看>>
python编辑器打不开_关于命令ride.py打不开RF,而是打开pycharm编辑器问题解决思路...
查看>>
python编译exe同时支持32位_第三周:同时管理64位和32位版本的Python,并用Pyinstaller打包成exe...
查看>>
Python 和Java 哪个更适合做自动化测试?
查看>>
Python编程:掌握高级语言程序设计。从零基础到精通,收藏这篇就够了!
查看>>
python 图片转ico
查看>>
python 图片转文字、语音转文字、文字转语音保存音频并朗读
查看>>
python 在包含类似字符\x16、\x12、\x某某的数组中将以\x开头的字符找出来的方法
查看>>
Python 在并行进程之间共享字典
查看>>
Python 垃圾收集器文档
查看>>
python 基于 wordcloud + jieba + matplotlib 生成词云
查看>>
python 基于detectron或mask_rcnn的mask遮罩区域进行图片截取
查看>>
Python编程:Tkinter图形界面设计(2)
查看>>
Python 基础 - Day 5 Learning Note - 模块 之 标准库:time (1)
查看>>
Python 基础一
查看>>
python 基础操作知识整理总结
查看>>
Python 基础知识点整理与分享,期盼你的交流!
查看>>
python 基础第七篇
查看>>