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);