ios关于日期处理
最近在项目的开发的过程中遇到了关于ios日期处理的问题,直接上代码,各位可以看一看这段代码有没有问题
NSDateFormatter *LocalDateFormatter = [[NSDateFormatter alloc] init];
LocalDateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ";
NSString *dateString = [LocalDateFormatter stringFromDate:[NSDate date]];
这段代码一开始看感觉没有什么问题,就是基本的对日期进行格式化,可是如果这个时候,我们把手机的日历切换为日本日历或者其他日历(只要不是公历),这段代码就有可能有问题,我就以日本日历为例。
正常情况下(手机一般为公历)显示的结果:
2016-03-08 **:**:**
但是如果用的时日本日历,显示结果:
0028-03-08 **:**:**
0028
在日本代表但是,像中国古代康熙28年所以,在我们工作过程中,需要指定相应的日历,区域,下面介绍一些常用的方式
NSCalendar
系统的设置 > 通用 > 多语言环境 > 日历上述的日历设置和NSCalendar是有直接关系的。
■比如设定成「日本日历」的时候、
currentCalendar
的值是NSJapaneseCalendar
■设定成「公历」的时候、
currentCalendar
的值是NSGregorianCalendar
注意:在程序中,如果想要用公历的时候,就要将NSDateFormatter的日历设置成公历。否则随着用户的系统设置的改变,取得的日期的格式也会不一样。currentCalendar
取得的值会一直保持在cache
中,第一次取得以后如果用户修改该系统日历设定,这个值也不会改变。如果用autoupdatingCurrentCalendar
,那么每次取得的值都会是当前系统设置的日历的值。
通过Calendar可以设置TimeZone和Locale。
如果你要通过NSDateFormatter来设置日期格式,比如”yyyy-MM-dd”等,那需要注意对Formatter设置日历。
NSCalendar *calendar =[[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setCalendar:calendar];
NSLocale
[NSLocale currentLocale]
[NSLocale systemLocale]
[NSLocale autoUpdatingCurrentLocale]
NSLocale
与下面的设置有关:系统的设置 > 通用 > 多语言环境 > 区域格式
系统的设置 > 通用 > 日期与时间 > 24小时制
根据国家区域的设置的不同,格式也会不一样,例如:
中国: 「11月」 美国:「November」
中国: 「上午」 美国:「AM」
如果你的应用程序在多个国家发布,那你就需要注意设置NSLocale。
比如:
[[NSLocale alloc] initWithLocaleIdentifier:@”en_US”]
cunnretLocale是用户设定的值。
systemLocale是设备默认的值。
NSDateFormatter
理解日期格式的设置非常重要。
有时候会遇到下面的情况:
比如你将格式设置成
@”yyyy-MM-dd HH:mm:ss”
但显示出来的却是
「0024-11-16 21:09:17」
(这个时候用户把日历设置成了日本日历)
又或者显示成
「2012-11-17 下午11:07:47」
(24小时制关闭的时候)
上述的情况如果不考虑到的话,那程序中就会出现bug。
如果将日期的格式的日历设置成公历,
NSDateFormatter
设置成 NSGregorianCalendar
,需要用24小时制的时候,可以把
Locale
设置成systemLocale
。(如果你没有特定需要指定的Locale的话)
时间戳
timeIntervalSince1970
一、转化时间戳方法:
NSString *timeSp = [NSString stringWithFormat:@"%d", (long)[localeDate timeIntervalSince1970]];
NSLog(@"timeSp:%@",timeSp);
//时间戳的值
二、把获取的时间转化为当前时间
NSDate *datenow = [NSDate date];
//现在时间,你可以输出来看下是什么格式
NSTimeZone *zone = [NSTimeZone systemTimeZone];
NSInteger interval = [zone secondsFromGMTForDate:datenow];
NSDate *localeDate = [datenowdateByAddingTimeInterval: interval];
NSLog(@"%@", localeDate);
三、时间戳转换为时间的方法
NSDate *confirmTimesp = [NSDate dateWithTimeIntervalSince1970:136789745666];
NSLog(@"136789745666 = %@", confirmTimesp);
【ios关于日期处理】参考的博客:
http://kevin-wu.net/tag/nsdate/
http://www.cnblogs.com/wayne23/archive/2013/03/25/2981009.html
http://www.helloswift.com.cn/swiftbase/2015/0328/3532.html
推荐阅读
- 2020-04-07vue中Axios的封装和API接口的管理
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- 四首关于旅行记忆的外文歌曲
- 醒不来的梦
- iOS中的Block
- 关于自我为中心的一点感想
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- 记录iOS生成分享图片的一些问题,根据UIView生成固定尺寸的分享图片
- 关于Ruby的杂想
- 关于读书的思考