iOS之时间:
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];
}