Foundation框架—時間處理對象NSDate

  

NSDate類用於保存時間值,同時提供了一些方法來處理一些基於秒級別時差(Time Interval)運算和日期之間的遲早比較等。程序員

 

 

1. NSDate的構造方法和構造獲取實例的屬性多線程

用於建立NSDate實例的類方法有dom

 

+ (instancetype)date;//返回當前時間post

+ (instancetype)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;//返回以當前時間爲基準,而後過了secs秒的時間測試

+ (instancetype)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)ti;//返回以2001/01/01 GMT爲基準,而後過了secs秒的時間spa

+ (instancetype)dateWithTimeIntervalSince1970:(NSTimeInterval)secs;//返回以1970/01/01 GMT爲基準,而後過了secs秒的時間線程

+ (instancetype)dateWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:(NSDate *)date;//date實例 加上多少secsToBeAdded 秒後的時間,日誌

 

@property (class, readonly, copy) NSDate *distantFuture;//返回不少年之後的將來的某一天。(好比你須要一個比如今(Now)晚(大)很長時間的時間值,則能夠調用該方法。測試返回了4000/12/31 16:00:00)code

@property (class, readonly, copy) NSDate *distantPast;//返回不少年之前的某一天。(好比你須要一個比如今(Now)早(小)大很長時間的時間值,則能夠調用該方法。測試返回了公元前0001/12/31 17:00:00)orm

  


用於建立NSDate實例的實例方法有 

- (id)init;

初始化爲當前時間

- (instancetype)initWithTimeIntervalSinceNow:(NSTimeInterval)secs;//初始化爲以當前時間爲基準,而後過了secs秒的時間

- (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)secs;//返回以目前的實例中保存的時間爲基準,而後過了secs秒的時間

- (instancetype)initWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:(NSDate *)date;//初始化爲以date爲基準,而後過了secs秒的時間

 

2. 使用擴展

日期之間比較可用如下方法

- (BOOL)isEqualToDate:(NSDate *)otherDate;

otherDate比較,相同返回YES

- (NSDate *)earlierDate:(NSDate *)anotherDate;

anotherDate比較,返回較早的那個日期

- (NSDate *)laterDate:(NSDate *)anotherDate;

anotherDate比較,返回較晚的那個日期

- (NSComparisonResult)compare:(NSDate *)other;

該方法用於排序時調用:

. 當實例保存的日期值與anotherDate相同時返回NSOrderedSame

. 當實例保存的日期值晚於anotherDate時返回NSOrderedDescending

. 當實例保存的日期值早於anotherDate時返回NSOrderedAscending

 

 //兩個NSDate的時間間隔(單位爲秒)

獲取時間間隔

調用API的時間實例爲參考系

 

- (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate;//與anotherDate的時間間隔做比

@property (readonly) NSTimeInterval timeIntervalSinceNow;//與當前的時間間隔做比

@property (readonly) NSTimeInterval timeIntervalSince1970;//與1970年時間做弊

 

- (id)addTimeInterval:(NSTimeInterval)seconds ;

- (instancetype)dateByAddingTimeInterval:(NSTimeInterval)ti;

 

  

3. 取回時間間隔可用如下方法

- (NSTimeInterval)timeIntervalSinceDate:(NSDate *)refDate;

refDate爲基準時間,返回實例保存的時間與refDate的時間間隔

- (NSTimeInterval)timeIntervalSinceNow;

以當前時間(Now)爲基準時間,返回實例保存的時間與當前時間(Now)的時間間隔

- (NSTimeInterval)timeIntervalSince1970;

1970/01/01 GMT爲基準時間,返回實例保存的時間與1970/01/01 GMT的時間間隔

- (NSTimeInterval)timeIntervalSinceReferenceDate;

2001/01/01 GMT爲基準時間,返回實例保存的時間與2001/01/01 GMT的時間間隔

+ (NSTimeInterval)timeIntervalSinceReferenceDate;

2001/01/01 GMT爲基準時間,返回當前時間(Now)與2001/01/01 GMT的時間間隔

 

 

4. 將時間表示成字符串 

@property (readonly, copy) NSString *description;

- (NSString *)descriptionWithLocale:(nullable id)locale;

YYYY-MM-DD HH:MM:SS ±HHMM的格式表示時間。(其中 "±HHMM" 表示與GMT的存在多少小時多少分鐘的時區差別。好比,若時區設置在北京,則 "±HHMM" 顯示爲 "+0800")

 

 

5.若是想讓時間持續和系統的時間一致,那就在多線程裏開一個定時器,每一秒鐘調用一個方法,在方法裏從新修改Label上顯示的時間;

 

6.當系統時鐘改變時,監聽這個廣播 能夠獲得通知 

FOUNDATION_EXPORT NSNotificationName const NSSystemClockDidChangeNotification

 

7.經過上面的介紹,咱們已經基本掌握了NSDate的經常使用API如今貼上幾個實戰代碼

01. NSDate的基本使用

 1 //        獲取時間
 2         NSDate *date = [NSDate date];
 3         NSLog(@"國際標準時間:%@",date);
 4 //        獲取系統當前時區
 5         NSTimeZone *zone = [NSTimeZone systemTimeZone];//中國位於東八區、與國際標準時間相差8小時
 6 //      獲取當前時區與格林尼治時間的間隔
 7         NSTimeInterval ti  = [zone secondsFromGMTForDate:date];
 8 //獲取本地時間
 9         NSDate *localDate = [NSDate dateWithTimeIntervalSinceNow:ti];
10         NSLog(@"當前時區的時間:%@",localDate);

 02.日期格式轉換

 /*
     NSDate<->NSString 須要藉助NSDateFormatter類
     - (NSString *)stringFromDate:(NSDate *)date;
     - (NSDate *)dateFromString:(NSString *)string;
     */
        //        獲取時間
        NSDate *date = [NSDate date];
        NSLog(@"國際標準時間:%@",date);
        //        獲取系統當前時區
        NSTimeZone *zone = [NSTimeZone systemTimeZone];//中國位於東八區、與國際標準時間相差8小時
        //      獲取當前時區與格林尼治時間的間隔
        NSTimeInterval ti  = [zone secondsFromGMTForDate:date];
        //獲取本地時間
        NSDate *localDate = [NSDate dateWithTimeIntervalSinceNow:ti];
        NSLog(@"當前時區的時間:%@",localDate);
        //
        /*日期格式轉換*/
        NSDateFormatter *dfmt = [[NSDateFormatter alloc]init];
        //設置日期格式 注意大小寫的區分
        dfmt.dateFormat = @"yyyy年MM月dd日 HH時:mm分:ss秒";
        //按照日期格式 轉化爲字符串
        //GMT時間轉換爲日期字符串
        NSLog(@"日期轉字符串2:%@",[dfmt stringFromDate:date]);
        //本地時間對象轉化內時間字符串
        NSString *localDateString = [dfmt stringFromDate:localDate];//調用這個API時,默認將時間對象認爲時格林尼日誌時間(內部又從新加了格林尼治時間與當前時區的時差8小時,因此要獲取當前時間的字符串對象時,不須要再額外轉換成當前時區的時間對象)
        NSLog(@"日期轉字符串:%@",localDateString);
        //按照日期格式 將時間字符串轉化爲時間對象
        NSDate *localDate2 = [dfmt dateFromString:localDateString];
        NSLog(@"字符串轉日期:%@",localDate2);

03-時間比較

 // insert code here...
        /*時間比較
         官方提供了4個經常使用API
         比較兩個時間的前後
         - (NSDate *)earlierDate:(NSDate *)anotherDate;
         - (NSDate *)laterDate:(NSDate *)anotherDate;
         - (NSComparisonResult)compare:(NSDate *)other;
         比較日期是否相等
         - (BOOL)isEqualToDate:(NSDate *)otherDate;
         //比較兩個時間間隔
         - (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate;
         */
        NSDate *date1 = [NSDate date];
        NSDate *date2 = [NSDate dateWithTimeIntervalSinceNow:10];//+10秒
        
        NSDate *tmpDate = [[NSDate alloc]init];
        //返回較早那個時間
        tmpDate = [date1 earlierDate:date2];
        NSLog(@"earlierDate:%@",tmpDate);
        //返回較晚那個時間
        tmpDate = [date1 laterDate:date2];
        NSLog(@"laterDate:%@",tmpDate);
        
        //比較兩個時間 的時間間隔 (程序員運行消耗緣由,會產生微小偏差)
        NSTimeInterval ti = [date2 timeIntervalSinceDate:date1];
        NSLog(@"interval:%lf",ti);
        
        if ([date1 isEqualToDate:date2]) {
            NSLog(@"兩時間相同");
        }else{
            NSLog(@"兩時間不相同");
        }
        
        NSComparisonResult res =  [date1 compare:date2];
        switch (res) {
            case NSOrderedSame:{
                NSLog(@"時間相同");
            } break;
                
            case NSOrderedAscending:{
                NSLog(@"遞增關係");//date1較早
            } break;
                
            case NSOrderedDescending:{
                NSLog(@"遞減關係");
            } break;
                
            default:
                break;
        }

 

04-系統相關API的調用代碼實踐

 //============================時間的基本使用=================================//
    //1.獲取當下時間
    NSDate*date=[NSDate date];
    MVLog(@"當前:%@",date);
    NSTimeInterval tival = 100.0f;
    //2.比當下時間晚100s的時間
    NSDate *date_late100s_now = [NSDate dateWithTimeIntervalSinceNow:tival];//
    MVLog(@"比當下晚100s的時間:%@",date_late100s_now);
    //3.比1970年晚100s的時間
    NSDate *date_late100s_1970 = [NSDate dateWithTimeIntervalSince1970:tival];//
    MVLog(@"比1970年晚100s的時間:%@",date_late100s_1970);
    //4.隨機返回一個未來的時間
    NSDate *date_random_feature = [NSDate distantFuture];//
    MVLog(@"distantFuture=%@",date_random_feature);
    //5.隨機訪問一個過去的時間
    NSDate *date_random_pass = [NSDate distantPast];//
    MVLog(@"distantPass=%@",date_random_pass);
    NSDate*date_late1day_now=[NSDate dateWithTimeIntervalSinceNow:60*60*24];//
    //6.返回早一點的時間
    MVLog(@"earlierDate = %@",[date earlierDate:date_late1day_now]);//
    //7.返回晚一點的時間
    MVLog(@"laterDate = %@",[date laterDate:date_late1day_now]);//
    //8.返回從1970到如今的秒數
    MVLog(@"timeIntervalSince1970:%f",date.timeIntervalSince1970);//
    //9.兩個日期是否相同
    MVLog(@"date is equal?: %d",[date isEqualToDate:date_late1day_now]);//
    //9.兩個日期進行比較
    NSComparisonResult cmpRes = [date compare:date_late1day_now];//
    switch (cmpRes) {
        case NSOrderedAscending:{//升序
            MVLog(@"升序");
        }break;
        case NSOrderedSame:{//相等
            MVLog(@"相等");
        }break;
        case NSOrderedDescending:{//降序
            MVLog(@"降序");
        }break;
    }
    //10.某日期+上時間間隔--->新日期
    NSDate  *newDate_adding1dayTival = [date dateByAddingTimeInterval:60*60*24];//
    MVLog(@"明日:%@",newDate_adding1dayTival); 
    //11.某日期  距離  00:00:00 UTC on 1 January 2001.這個基準時間 的秒數
    NSTimeInterval tival_since2001toNow = [[NSDate date]timeIntervalSinceReferenceDate];
    MVLog(@"某日期  距離  00:00:00 UTC on 1 January 2001.這個基準時間 的秒數:%f",tival_since2001toNow);

 

相關文章
相關標籤/搜索