iOS - OC NSDate 時間

前言

  • NSDatecode

    @interface NSDate : NSObject <NSCopying, NSSecureCoding>
    • NSDate 用來表示公曆的 GMT 時間(格林威治時間)。是獨立與任何曆法的,它只是時間相對於某個時間點的時間差;NSDate 是進行日曆計算的基礎。
  • NSDateComponentscomponent

    @interface NSDateComponents : NSObject <NSCopying, NSSecureCoding>
    • NSDateComponents 封裝了具體年月日、時秒分、周、季度等。將時間表示成適合人類閱讀和使用的方式,經過 NSDateComponents 能夠快速而簡單地獲取某個時間點對應的「年」,「月」,「日」,「時」,「分」,「秒」,「周」等信息。固然一旦涉及了年月日時分秒就要和某個曆法綁定,所以 NSDateComponents 必須和 NSCalendar 一塊兒使用,默認爲公曆。NSDateComponents 除了像上面說的表示一個時間點外,還能夠表示時間段,例如:兩週,三個月,20年,7天,10分鐘,50秒等等。時間段用於日曆的計算,例如:獲取當前曆法下,三個月前的某個時間點。能夠說,要獲取某個時間點在某個曆法下的表示,須要 NSDateComponents; 要計算當前時間點在某個曆法下對應的一個時間段前或後的時間點,須要 NSDateComponents。NSDateComponents 返回的 day, week, weekday, month, year 這一類數據都是從 1 開始的。由於日曆是給人看的,不是給計算機看的,從 0 開始就是個錯誤。
  • NSDateFormatterorm

    @interface NSDateFormatter : NSFormatter
    • NSDateFomatter 表示的時間默認以公曆(即陽曆)爲參考,能夠經過設置 calendar 屬性變量得到特定曆法下的時間表示。

一、NSDate 的建立

// 對象方法
        
        // 當前時間值,GMT 時間
        NSDate *date1 = [[NSDate alloc] init];
            
        // 當前時間加 n 秒後的值
        NSDate *date2 = [[NSDate alloc] initWithTimeIntervalSinceNow:10];
            
        // 某個時間增長 n 秒後的值
        NSDate *date3 = [[NSDate alloc] initWithTimeInterval:10 sinceDate:date2];
            
        // 從 1970-01-01 00:00:00 (GMT) 增長 n 秒後的值
        NSDate *date4 = [[NSDate alloc] initWithTimeIntervalSince1970:3600];
            
        // 從 2001-01-01 00:00:00 (GMT) 增長 n 秒後的值
        NSDate *date5 = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:10];
        
    // 類方法
        
        // 當前時間值,GMT 時間
        NSDate *date6 = [NSDate date];
            
        // 當前時間加 n 秒後的值
        NSDate *date7 = [NSDate dateWithTimeIntervalSinceNow:10];
            
        // 某個時間增長 n 秒後的值
        NSDate *date8 = [NSDate dateWithTimeInterval:10 sinceDate:date2];
            
        // 從 1970-01-01 00:00:00 (GMT) 增長 n 秒後的值
        NSDate *date9 = [NSDate dateWithTimeIntervalSince1970:3600];
            
        // 從 2001-01-01 00:00:00 (GMT) 增長 n 秒後的值
        NSDate *date10 = [NSDate dateWithTimeIntervalSinceReferenceDate:10];
            
        // 將來某一個隨機時間
        NSDate *date11 = [NSDate distantFuture];
            
        // 過去某一個隨機時間
        NSDate *date12 = [NSDate distantPast];
            
        // 指定時間間隔
        /*
            某個時間增長 n 秒後的值
        */
        NSDate *date13 = [date6 dateByAddingTimeInterval:20];

二、NSDate 時間間隔的計算

NSDate *date1 = [NSDate date];
    NSDate *date2 = [date1 dateByAddingTimeInterval:20];
        
    // 實例保存的時間 與 當前時間 的時間間隔,單位 秒
    NSTimeInterval interval1 = [date2 timeIntervalSinceNow];
        
    // 實例保存的時間 與 指定時間 的時間間隔,單位 秒
    NSTimeInterval interval2 = [date2 timeIntervalSinceDate:date1];
        
    // 實例保存的時間 與 1970-01-01 00:00:00 (GMT) 的時間間隔,單位 秒
    NSTimeInterval interval3 = [date1 timeIntervalSince1970];
        
    // 實例保存的時間 與 2001-01-01 00:00:00 (GMT) 的時間間隔,單位 秒
    NSTimeInterval interval4 = [date1 timeIntervalSinceReferenceDate];
        
    // 當前時間 與 2001-01-01 00:00:00 (GMT) 的時間間隔,單位 秒
    NSTimeInterval interval5 = [NSDate timeIntervalSinceReferenceDate];

三、NSDate 時間的比較

NSDate *date1 = [NSDate date];
    NSDate *date2 = [date1 dateByAddingTimeInterval:10];
        
    // isEqualToDate
        
        // 判斷兩個時間是否相等
        BOOL bl = [date1 isEqualToDate:date2];
        
    // compare
        
        // 比較兩個時間大小
        NSComparisonResult result = [date1 compare:date2];
      
    // earlierDate
        
        // 比較兩個時間,返回 較早的時間
        NSDate *date3 = [date1 earlierDate:date2];
            
    // laterDate
        
        // 比較兩個時間,返回 較晚的時間
        NSDate *date4 = [date1 laterDate:date2];

四、NSDateComponents 的建立

// 由手動設置建立
    NSDateComponents *compt1 = [[NSDateComponents alloc] init];
        
    // 日曆
    [compt1 setCalendar:[NSCalendar currentCalendar]];
    
    // 時區
    [compt1 setTimeZone:[NSTimeZone systemTimeZone]];
    
    // 紀元
    [compt1 setEra:1];
    
    // 年
    [compt1 setYear:2016];
    
    // 月
    [compt1 setMonth:3];
    
    // 日
    [compt1 setDay:1];
    
    // 時
    [compt1 setHour:00];
    
    // 分
    [compt1 setMinute:10];
    
    // 秒
    [compt1 setSecond:55];
    
    // 微妙
    [compt1 setNanosecond:280];
    
    // 刻鐘
    [compt1 setQuarter:0];
    
    // 周幾
    [compt1 setWeekday:3];
    
    // 指定日期爲本月的第幾個星期幾
    [compt1 setWeekdayOrdinal:1];
    
    // 指定日期爲本月的第幾周
    [compt1 setWeekOfMonth:1];
    
    // 指定日期爲本年的第幾周
    [compt1 setWeekOfYear:10];
    
    //
    [compt1 setYearForWeekOfYear:2016];
    
    //  由已知 date 建立
    /*
        只有明確指定了 unitFlags,NSDateComponents 相應的那一部分纔有值
    */
    NSDateComponents *compt2 = [[NSCalendar currentCalendar] components:NSCalendarUnitEra
                                                                      | NSCalendarUnitYear
                                                                      | NSCalendarUnitMonth
                                                                      | NSCalendarUnitDay
                                                                      | NSCalendarUnitHour
                                                                      | NSCalendarUnitMinute
                                                                      | NSCalendarUnitSecond
                                                                      | NSCalendarUnitNanosecond
                                                                      | NSCalendarUnitQuarter
                                                                      | NSCalendarUnitWeekday
                                                                      | NSCalendarUnitWeekdayOrdinal
                                                                      | NSCalendarUnitWeekOfMonth
                                                                      | NSCalendarUnitWeekOfYear
                                                                      | NSCalendarUnitYearForWeekOfYear
                                                                      | NSCalendarUnitCalendar
                                                                      | NSCalendarUnitTimeZone
                                                    
                                                               fromDate:[NSDate date]];

五、NSDateComponents 時間間隔的計算

NSDate *date1 = [NSDate date];
    NSDate *date2 = [NSDate dateWithTimeInterval:5*60*60+75 sinceDate:date1];
        
    NSDateComponents *compt = [[NSCalendar currentCalendar] components:NSCalendarUnitMinute 
                                                                     | NSCalendarUnitSecond 
                                                              fromDate:date1 
                                                                toDate:date2 
                                                               options:0];

六、NSDateComponents 與 NSDate 的相互轉換

NSCalendar *calendar = [NSCalendar currentCalendar];
        
    // NSDate 轉 NSDateComponents
    
        NSDateComponents *compt = [calendar components:NSCalendarUnitYear 
                                                     | NSCalendarUnitMonth 
                                                     | NSCalendarUnitDay 
                                              fromDate:[NSDate date]];
        
    // NSDateComponents 轉 NSDate
        
        // 轉換時間時,使用默認的時區 GMT 時區
        NSDate *date = [calendar dateFromComponents:compt];                                                 
            
        // 獲得本地時間,避免時區問題
        date = [date dateByAddingTimeInterval:[[NSTimeZone systemTimeZone] secondsFromGMTForDate:date]];

七、NSDateComponents 與 NSDate 的計算

NSDateComponents *compt = [[NSDateComponents alloc] init];
    [compt setDay:25];
    [compt setHour:4];
    [compt setMinute:66];
        
    // NSDate 加上 NSDateComponents 表示的一段時間
    NSDate *date = [[NSCalendar currentCalendar] dateByAddingComponents:compt toDate:[NSDate date] options:0];
        
    // 獲得本地時間,避免時區問題
    date = [date dateByAddingTimeInterval:[[NSTimeZone systemTimeZone] secondsFromGMTForDate:date]];

八、NSDateFormatter 的時間格式化

G -- 紀元                  通常會顯示公元前(BC)和公元(AD)
    y -- 年                    假如是2013年,那麼 yyyy=2013,yy=13
    M -- 月                    假如是3月,那麼 M=3,MM=03,MMM=Mar,MMMM=March;假如是11月,那麼M=11,MM=11,
                                MMM=Nov,MMMM=November
    w -- 一年中的第幾周         假如是1月8日,那麼 w=2(這一年的第二個周)
    W -- 一個月中的第幾周       與日曆排列有關,假如是2013年4月21日,那麼 W=4(這個月的第四個周)
    F -- 月份包含的周           與日曆排列無關,和上面的 W 不同,F 只是單純以7天爲一個單位來統計周,例如7號必定是第一個周,
                               15號必定是第三個周,與日曆排列無關。
    D -- 一年中的第幾天         假如是1月20日,那麼 D=20(這一年的第20天);假如是2月25日,那麼 D=31+25=56(這一年的第56天)
    d -- 一個月中的第幾天       假如是5號,那麼 d=5,dd=05   假如是15號,那麼 d=15,dd=15
    E -- 星期幾                假如是星期五,那麼 E=Fri,EEEE=Friday
    a -- 上午(AM)/下午(PM)
    H -- 24小時制              顯示爲0--23,假如是午夜00:40,那麼 H=0:40,HH=00:40
    h -- 12小時制              顯示爲1--12,假如是午夜00:40,那麼 h=12:40
    K -- 12小時制              顯示爲0--11,假如是午夜00:40,那麼 K=0:40,KK=00:40
    k -- 24小時制              顯示爲1--24,假如是午夜00:40,那麼 k=24:40
    m -- 分鐘                  假如是5分鐘,那麼 m=5,mm=05;假如是45分鐘,那麼 m=45,mm=45
    s -- 秒                    假如是5秒鐘,那麼 s=5,ss=05;假如是45秒鐘,那麼 s=45,ss=45
    S -- 毫秒                  通常用 SSS 來顯示
    z -- 時區                  表現形式爲 GMT+08:00
    Z -- 時區                  表現形式爲 +0800

    // 使用 NSDateFormatter 轉換時間字符串時,默認的時區是系統時區,例如在中國通常都是北京時間(+8),
    // 若是直接轉換會致使結果相差8小時,因此通常的作法是先指定時區爲GMT標準時間再轉換。
    
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        
    // 設置時區,不設置時默認的時區是系統時區(GMT+8)
    [formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
        
    // 設置日期格式,以字符串表示的日期形式的格式
    [formatter setDateFormat:@"G yyyy-MM-dd E D F w W a z HH:mm:ss.SSS"];
        
    // 格式化日期,GMT 時間,NSDate 轉 NSString
    NSString *str = [formatter stringFromDate:[NSDate date]];

九、1437494603 (秒) 格式 轉 YYYY-MM-dd HH:mm:ss 格式

// 計算日期
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:1437494603];               
        
    // 建立時間戳
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];                    
        
    // 設置日期格式,以字符串表示的日期形式的格式
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];                               
        
    // 轉換成指定的格式
    NSString *string = [formatter stringFromDate:date];

十、NSDate 與 NSString 的相互轉換

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        
    // 設置時區 GMT
    [formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
        
    // 加入一些別的英文字符串時,需用單引號來引入
    [formatter setDateFormat:@"yyyy年MM月dd日 HH點mm分ss秒 'iOS Date Test'"];
        
    // NSString 轉 NSDate
    NSDate *date = [formatter dateFromString:@"2016年01月12日 1點8分50秒"];
        
    // NSDate 轉 NSString
    NSString *str = [formatter stringFromDate:date];

十一、時區差值轉換

// 獲得當前時間(世界標準時間 UTC/GMT)
    NSDate *date = [NSDate date];
        
    // 設置系統時區爲本地時區
    NSTimeZone *zone = [NSTimeZone systemTimeZone];
        
    // 計算本地時區與 GMT 時區的時間差
    NSInteger interval = [zone secondsFromGMT];
        
    // 在 GMT 時間基礎上追加時間差值,獲得本地時間
    date = [date dateByAddingTimeInterval:interval];
相關文章
相關標籤/搜索