iOS之时间
2015-09-22 20:45
267 查看
iOS之时间:
1、NSDate时间戳,即代表某一个时间点
2、NSCalendar提供了不同历法的时间信息,支持日历的计算
3、NSDateFomatter在特定历法下的时间表示,基本用于不同历法的时间转换,默认是阳历NSDatecomponents是获取可读时间表示方式,比如“年”,“月”,“日”,“时”,“分”,“秒”,“周”等,和NSCalendar一起用,默认是阳历;还可以表示一个时间段,比如几周,几月,几年;还可以获取在当前历法下某一时间点的前或者后一个时间点
4、NSLoclale 根据不同的语言环境,返回不同的语言的时间数据,默认是当前系统设置的语言格式
上代码:
1、NSDateComponents的用法
2、NSDate的一些用法,因为有时区概念timeZone,所以有时候 — 时间与字符串的转化挺麻烦的
有一个小技巧就是,将NSDateFormatter存进当前线程中,这样不用每次新建NSDateFormatter
对象了,因为每次新建NSDateFormatter对象是非常耗时间的,容易阻塞主线程
1、NSDate时间戳,即代表某一个时间点
2、NSCalendar提供了不同历法的时间信息,支持日历的计算
3、NSDateFomatter在特定历法下的时间表示,基本用于不同历法的时间转换,默认是阳历NSDatecomponents是获取可读时间表示方式,比如“年”,“月”,“日”,“时”,“分”,“秒”,“周”等,和NSCalendar一起用,默认是阳历;还可以表示一个时间段,比如几周,几月,几年;还可以获取在当前历法下某一时间点的前或者后一个时间点
4、NSLoclale 根据不同的语言环境,返回不同的语言的时间数据,默认是当前系统设置的语言格式
上代码:
1、NSDateComponents的用法
(1)根据一个时间点,获取他在特定日历下的所有信息 // 先定义一个遵循某个历法的日历对象 NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; // 通过已定义的日历对象,获取某个时间点的NSDateComponents表示,并设置需要表示哪些信息(NSYearCalendarUnit, NSMonthCalendarUnit, NSDayCalendarUnit等) NSDateComponents *dateComponents = [greCalendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit | NSWeekOfMonthCalendarUnit | NSWeekOfYearCalendarUnit fromDate:[NSDate date]]; NSLog(@"year(年份): %i", dateComponents.year); NSLog(@"quarter(季度):%i", dateComponents.quarter); NSLog(@"month(月份):%i", dateComponents.month); NSLog(@"day(日期):%i", dateComponents.day); NSLog(@"hour(小时):%i", dateComponents.hour); NSLog(@"minute(分钟):%i", dateComponents.minute); NSLog(@"second(秒):%i", dateComponents.second); // Sunday:1, Monday:2, Tuesday:3, Wednesday:4, Friday:5, Saturday:6 NSLog(@"weekday(星期):%i", dateComponents.weekday); // 苹果官方不推荐使用week NSLog(@"week(该年第几周):%i", dateComponents.week); NSLog(@"weekOfYear(该年第几周):%i", dateComponents.weekOfYear); NSLog(@"weekOfMonth(该月第几周):%i", dateComponents.weekOfMonth); (2)设置一个时间点,获取他在特定日历下的所有信息,或者前后的时间信息 // 先定义一个遵循某个历法的日历对象 NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; // 定义一个NSDateComponents对象,设置一个时间点 NSDateComponents *dateComponentsForDate = [[NSDateComponents alloc] init]; [dateComponentsForDate setDay:6]; [dateComponentsForDate setMonth:5]; [dateComponentsForDate setYear:2004]; // 根据设置的dateComponentsForDate获取历法中与之对应的时间点 // 这里的时分秒会使用NSDateComponents中规定的默认数值,一般为0或1。 NSDate *dateFromDateComponentsForDate = [greCalendar dateFromComponents:dc]; // 定义一个NSDateComponents对象,设置一个时间段 NSDateComponents *dateComponentsAsTimeQantum = [[NSDateComponents alloc] init]; [dateComponentsForDate setDay:6]; // 在当前历法下,获取6天后的时间点 NSDate *dateFromDateComponentsAsTimeQantum = [greCalendar dateByAddingComponents:dateComponentsAsTimeQantum toDate:[NSDate date] options:0]; (3)获取这两个时间点的时差 // 先定义一个遵循某个历法的日历对象 NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; // 根据两个时间点,定义NSDateComponents对象,从而获取这两个时间点的时差 NSDateComponents *dateComponents = [greCalendar components:NSYearCalendarUnit fromDate:[NSDate dateWithTimeIntervalSince1970:0] toDate:[NSDate date] options:0]; NSLog(@"number of years:%i", dateComponents.year); (4) // 当前时间对应的月份中有几天 [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].length; // 当前时间对应的月份中有几周(前面说到的firstWeekday会影响到这个结果) [[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].length; // 当前时间对应的周是当前年中的第几周 [[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekOfYearCalendarUnit inUnit:NSYearCalendarUnit forDate:self]; [[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekCalendarUnit inUnit:NSYearCalendarUnit forDate:[NSDate date]]; // 当前时间对应的周是当前月中的第几周 [[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekOfMonthCalendarUnit inUnit:NSYearCalendarUnit forDate:self]; [[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]];
2、NSDate的一些用法,因为有时区概念timeZone,所以有时候 — 时间与字符串的转化挺麻烦的
有一个小技巧就是,将NSDateFormatter存进当前线程中,这样不用每次新建NSDateFormatter
对象了,因为每次新建NSDateFormatter对象是非常耗时间的,容易阻塞主线程
(1)时间转字符串 时区如果没有则默认是当前系统设置的时区 + (NSString *)stringFromDate:(NSDate *)date andFormat:(NSString *)format withTimeZone:(NSTimeZone *)timeZone { if (! date) { date = [NSDate date]; } if (! format) { format = @"yyyyMMdd HH:mm:ss"; } NSMutableDictionary *threadDict = [NSThread currentThread].threadDictionary; NSMutableDictionary *dateFormatters = nil; @synchronized(threadDict) { dateFormatters = threadDict[@"dateFormatters"]; if(dateFormatters == nil) { dateFormatters = [NSMutableDictionary dictionary]; threadDict[@"dateFormatters"] = dateFormatters; } } NSDateFormatter *formatter = dateFormatters[format]; if(formatter == nil) { formatter = [[NSDateFormatter alloc] init]; formatter.timeZone = [NSTimeZone systemTimeZone]; if([timeZone isKindOfClass:[NSTimeZone class]]) { formatter.timeZone = timeZone; } formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"]; formatter.dateFormat = format; dateFormatters[format] = formatter; } return [formatter stringFromDate:date]; } 时间转零时区的字符串 + (NSString *)stringFromDate:(NSDate *)date andFormat:(NSString *)format { return [self stringFromDate:date andFormat:format withTimeZone:nil]; } 时间转中国时区的字符串 + (NSString *)stringFromDate:(NSDate *)date andGMT8Format:(NSString *)format { return [self stringFromDate:date andFormat:format withTimeZone:[NSTimeZone timeZoneWithName:@"Asia/Shanghai"]]; } 字符串转时间,时区为当前系统设置的时区 + (NSDate *)dateFromString:(NSString *)dateStr withFormatter:(NSString *)format { NSAssert(dateStr && format, nil); NSMutableDictionary *threadDict = [NSThread currentThread].threadDictionary; NSMutableDictionary *dateFormatters = nil; @synchronized(threadDict) { dateFormatters = threadDict[@"dateFormatters"]; if(dateFormatters == nil) { dateFormatters = [NSMutableDictionary dictionary]; threadDict[@"dateFormatters"] = dateFormatters; } } NSDateFormatter *formatter = dateFormatters[format]; if(formatter == nil) { formatter = [[NSDateFormatter alloc] init]; formatter.timeZone = [NSTimeZone systemTimeZone]; formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"]; formatter.dateFormat = format; dateFormatters[format] = formatter; } return [formatter dateFromString:dateStr]; } // 字符串转时间 直接转 零时区 + (NSDate *)dateZeroFromString:(NSString *)dateStr withFormatter:(NSString *)format { NSAssert(dateStr && format, nil); NSDateFormatter *formatter = nil; if(formatter == nil) { formatter = [[NSDateFormatter alloc] init]; formatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; formatter.dateFormat = format; } return [formatter dateFromString:dateStr]; }
相关文章推荐
- IOS中延时执行的几种方式的比较和汇总
- IOS学习之 NSDate 8小时误差
- ios多线程开发详解
- iOS经典讲解之多线程应用场景
- iOS 测试打包
- iOS-C文件添加到iOS项目中,运行报错
- iOS并发编程指南
- IOS学习之 导航栏
- iOS开发 ---- 其他控件,弹窗,滑块,菊花,步进,分段等
- ios xcode如何修改应用的名称
- iOS开发 ----- Controller之间的传值
- iOS极光推送-具体步骤
- iOS8中Today Extension删除
- IOS去掉NavigationBar底部的那条黑线
- iOS ——点击sectionHeader进行跳转,不同的sectionHeader标签不同
- ios激情详解之GCD
- ios学习--TableView详细解释
- ios 类似QQ登录成功后的提示框
- IO7 和IOS8 弹出透明模态窗体
- iOS超精细详解之GCD