iOS 日期处理

在开发过程中,我们经常会遇到一些跟时间处理相关的工作,比如说,时间的比较,加减,格式化,NSString <----> NSDate, NSDate <---> NSCanlendar等等。今天我们来做个整理,理个头绪。方便我们自己记忆。

NSDate 介绍

  1. NSDate对象用来表示一个具体的时间点;
  2. NSDate是一个类簇。我们所使用的NSDate对象,都是NSDate的私有之类的实体;
  3. 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:时间容器,一个包含了详细的年月日时分秒的容器。


   转载规则


《iOS 日期处理》 志鹏 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
真机调试出错问题集 真机调试出错问题集
证书问题 问题: 在真机调试安装过程中出现 process launch failed: failed to get the task for XXXX错误信息 问题原因: 使用的证书不对, project和targets的 Si
2017-06-22
下一篇 
English-Level3-Unit3 English-Level3-Unit3
解释你和某个人的相识过程过去进行时 使用过去进行时表示过去发生并持续了一段时间的一个动作或事件。用动词 be 的过去时和动词的 + ing 形式构成过去进行时。` A: I met Elsa in Spain. I was visitin
2017-06-11 志鹏
  目录