在开发过程中,我们经常会遇到一些跟时间处理相关的工作,比如说,时间的比较,加减,格式化,NSString <----> NSDate, NSDate <---> NSCanlendar等等。今天我们来做个整理,理个头绪。方便我们自己记忆。--->---->
NSDate 介绍
- NSDate对象用来表示一个具体的时间点;
- NSDate是一个类簇。我们所使用的NSDate对象,都是NSDate的私有之类的实体;
- NSDate储存的是GMT时间,使用的时候会根据当前应用指定的时区进行时间上的增减,以供计算或显示。
方法的使用:
- 类方法初始化
//返回当前时间(获取的是GMT时间,需要获取某个时区的时间,看常用方法)
+(instancetype)date;
//返回以当前时间为基准,然后过了secs秒的时间
+(instancetype)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;
//返回以2001-01-01 GMT为基准,然后过了secs秒的时间
+(instancetype)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)ti;
//返回以1970-01-01 GMT为基准,然后过了secs秒的时间
+(instancetype)dateWithTimeIntervalSince1970:(NSTimeInterval)secs;
//返回以date时间为基准,过了secsToBeAdded秒的时间
+(instancetype)dateWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:(NSDate *)date;
- 实例方法初始化
`
objc
//初始化当前时间(获取的是GMT时间,需要获取某个时区的时间,看常用方法)
- (instancetype)init;
//初始化以当前时间为基准,然后过了secs秒的时间
- (instancetype)initWithTimeIntervalSinceNow:(NSTimeInterval)secs;
//初始化以1970-01-01 GMT为基准,然后过了secs秒的时间
- (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)secs;
//初始化以date时间为基准,过了secsToBeAdded秒的时间
- (instancetype)initWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:(NSDate *)date;
`
- 时间之间的比较
`
objc
//与anotherDate比较,返回较早的那个日期
- (NSDate )earlierDate:(NSDate )anotherDate;
//与anotherDate比较,返回较晚的那个日期
- (NSDate )laterDate:(NSDate )anotherDate;
/该方法用于排序时调用:
当实例保存的日期值与anotherDate相同时返回NSOrderedSame
当实例保存的日期值晚于anotherDate时返回NSOrderedDescending
当实例保存的日期值早于anotherDate时返回NSOrderedAscending /
- (NSComparisonResult)compare:(NSDate *)other;
//与otherDate比较,相同返回YES
- (BOOL)isEqualToDate:(NSDate *)otherDate;
`
- 取回时间间隔
`
objc
//以refDate为基准时间,返回实例保存的时间与refDate的时间间隔
- (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate;
//以当前时间(Now)为基准时间,返回实例保存的时间与当前时间(Now)的时间间隔
- (NSTimeInterval)timeIntervalSinceNow;
//以1970/01/01 GMT为基准时间,返回实例保存的时间与1970/01/01 GMT的时间间隔
- (NSTimeInterval)timeIntervalSince1970;
//以2001/01/01 GMT为基准时间,返回实例保存的时间与2001/01/01 GMT的时间间隔
- (NSTimeInterval)timeIntervalSinceReferenceDate;
- (NSTimeInterval)timeIntervalSinceReferenceDate;
`
时间的创建
创建当前时间
NSDate * now = [NSDate date];
根据指定的时间差创建时间
NSTimeInterval day = 24*60*60; NSDate * yesterday = [NSDate dateWithTimeIntervalSinceNow:-day]; NSDate *tomarror =[NSDate dateWithTimeIntervalSinceNow:day];
- 根据已有时间创建日期
NSTimeInterval day = 24*60*60; NSDate * now = [NSDate date]; NSDate * nextDay = [now dateByAddingTimeInterval:day]; NSDate * lastDay = [now dateByAddingTimeInterval:-day];
日期的比较
- 两日期是否相同
BOOL isEqual = [nextDay isEqualToDate:lastDay];
比较哪个日期更早
NSDate * earlier_date = [nextDay earlierDate:lastDay];
比较哪个日期更晚
NSDate * later_date = [nextDay laterDate:lastDay];
求两个时间相同秒数
NSTimeInterval time = [nextDay timeIntervalSinceDate:lastDay];
设置日期格式
- 根据系统预设创建日期格式
`
objc
- ( NSDateFormatter * )formate{
if (!_formate) {
}_formate = [[NSDateFormatter alloc]init]; [_formate setTimeStyle:NSDateFormatterLongStyle]; [_formate setDateStyle:NSDateFormatterLongStyle];
return _formate;
}`
根据格式化字符创建日期格式
-(NSDateFormatter*)formate{ if (!_formate) { _formate = [[NSDateFormatter alloc]init]; [_formate setDateFormat:@"yyyy/MM/dd HH/mm/ss Z"]; } return _formate; }
ps:这里的formate尽量使用一个懒加载的方式,并持有一个实例,有利用节约创建时间。
字符串<--->时间--->
字符串转时间
// 1.时间字符串 NSString * datestring = @"2017-06-13 14:44:11 +0800"; // 2.格式化对象的样式/z大小写都行/格式必须严格和字符串时间一样 [self.formate setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"]; // 3.利用时间格式化对象让字符串转换成时间 (自动转换0时区/东加西减) NSDate * date = [self.formate dateFromString:datestring];
时间转字符串
// 1.创建一个时间对象
NSDate * date = [NSDate date];
// 2.设置时间格式化对象的样式
[self.formate setDateFormat:@"yyyy/MM/dd HH:mm:s"];
// 3.利用时间格式化对象对时间进行格式化
NSString * datestring = [self.formate stringFromDate:date];
时区
- 获取当前时区
NSTimeZone * zone = [NSTimeZone systemTimeZone];
- 获取时差
//时区 NSTimeZone * zone = [NSTimeZone systemTimeZone]; //时间格式 NSDate * date = [NSDate date]; //时差 NSInteger seconds = [zone secondsFromGMTForDate:date];
NSCalendar
NSCalendar:日历。对世界上现存的常用历法进行了封装,即提供了不同的历法的时间信息,又支持日历的计算。
NSDateComponents
NSDateComponents:时间容器,一个包含了详细的年月日时分秒的容器。