ios--NSCalendar NSDateComponents

來源:互聯網
上載者:User

標籤:

原文:

 ios時間那點事--NSCalendar NSDateComponents

http://my.oschina.net/yongbin45/blog/156181


目錄[-]

  • iOS時間那點事
  • NSCalendar + NSDateComponents
  • NSDateComponents執行個體化的方式
  • 第一種:
  • 第二種:
  • 第三種:
  • NSCalendar中比較重要的方法和概念
  • firstWeekday
  • -(NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;
  • 答疑解惑:
  • -(NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;
  • -(BOOL)rangeOfUnit:(NSCalendarUnit)unit startDate:(NSDate *)datep interval:(NSTimeInterval )tip forDate:(NSDate *)date;
  • 本系列其他文章不斷更新中:
iOS時間那點事NSCalendar + NSDateComponents
  1. 曆法能使人類確定每一日再無限的時間中的確切位置並記錄曆史。
  2. 日曆,曆法,一般曆法都是遵循固定的規則的,具有周期性。日曆都是已知的或可預測的。
  3. 任何一種具體的曆法,首先必須明確規定起始點,即開始計算的年代,這叫“紀元”;以及規定一年的開端,這叫“歲首”。此外,還要規定每年所含的日數,如何劃分月份,每月有多少天等等。
  4. NSCalendar對世界上現存的常用的曆法進行了封裝,既提供了不同曆法的時間資訊,又支援日曆的計算。
  5. NSDateFomatter表示的時間預設以西曆(即陽曆)為參考,可以通過設定calendar屬性變數獲得特定曆法下的時間表示。
  6. NSDate是獨立與任何曆法的,它只是時間相對於某個時間點的時間差;NSDate是進行日曆計算的基礎。
  7. NSDateComponents將時間表示成適合人類閱讀和使用的方式,通過NSDateComponents可以快速而簡單地擷取某個時間點對應的“年”,“月”,“日”,“時”,“分”,“秒”,“周”等資訊。當然一旦涉及了年月日時分秒就要和某個曆法綁定,因此NSDateComponents必須和NSCalendar一起使用,預設為西曆。
  8. NSDateComponents除了像上面說的表示一個時間點外,還可以表示時間段,例如:兩周,三個月,20年,7天,10分鐘,50秒等等。時間段用於日曆的計算,例如:擷取當前曆法下,三個月前的某個時間點。
  9. 可以說,要擷取某個時間點在某個曆法下的表示,需要NSDateComponents;要計算目前時間點在某個曆法下對應的一個時間段前或後的時間點,需要NSDateComponents。
  10. NSDateComponents返回的day, week, weekday, month, year這一類資料都是從1開始的。因為日曆是給人看的,不是給電腦看的,從0開始就是個錯誤。
NSDateComponents執行個體化的方式第一種:
    <!-- lang: cpp -->//  先定義一個遵循某個曆法的日曆對象NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];//  通過已定義的日曆對象,擷取某個時間點的NSDateComponents表示,並設定需要表示哪些資訊(NSYearCalendarUnit, NSMonthCalendarUnit, NSDayCalendarUnit等)NSDateComponents *dateComponents = [greCalendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit | NSWeekOfMonthCalendarUnit | NSWeekOfYearCalendarUnit fromDate:[NSDate date]];NSLog(@"year(年份): %i", dateComponents.year);NSLog(@"quarter(季度):%i", dateComponents.quarter);NSLog(@"month(月份):%i", dateComponents.month);NSLog(@"day(日期):%i", dateComponents.day);NSLog(@"hour(小時):%i", dateComponents.hour);NSLog(@"minute(分鐘):%i", dateComponents.minute);NSLog(@"second(秒):%i", dateComponents.second);//  Sunday:1, Monday:2, Tuesday:3, Wednesday:4, Friday:5, Saturday:6NSLog(@"weekday(星期):%i", dateComponents.weekday);//  蘋果官方不推薦使用weekNSLog(@"week(該年第幾周):%i", dateComponents.week);NSLog(@"weekOfYear(該年第幾周):%i", dateComponents.weekOfYear);NSLog(@"weekOfMonth(該月第幾周):%i", dateComponents.weekOfMonth);

若擷取dateComponents對象時,設定components的時候未添加NSYearCalendarUnit,dateComponents.year將返回錯誤的數值,其他的也一樣,所以使用NSDateComponents表示時間時,要確保需要使用的資料都在componets中添加了。

第二種:
    <!-- lang: cpp -->//  先定義一個遵循某個曆法的日曆對象NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];//  定義一個NSDateComponents對象,設定一個時間點NSDateComponents *dateComponentsForDate = [[NSDateComponents alloc] init];[dateComponentsForDate setDay:6];[dateComponentsForDate setMonth:5];[dateComponentsForDate setYear:2004];//  根據設定的dateComponentsForDate擷取曆法中與之對應的時間點//  這裡的時分秒會使用NSDateComponents中規定的預設數值,一般為0或1。NSDate *dateFromDateComponentsForDate = [greCalendar dateFromComponents:dc];//  定義一個NSDateComponents對象,設定一個時間段NSDateComponents *dateComponentsAsTimeQantum = [[NSDateComponents alloc] init];[dateComponentsForDate setDay:6];//  在當前曆法下,擷取6天后的時間點NSDate *dateFromDateComponentsAsTimeQantum = [greCalendar dateByAddingComponents:dateComponentsAsTimeQantum toDate:[NSDate date] options:0];
第三種:
    <!-- lang: cpp -->//  先定義一個遵循某個曆法的日曆對象NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];//  根據兩個時間點,定義NSDateComponents對象,從而擷取這兩個時間點的時差NSDateComponents *dateComponents = [greCalendar components:NSYearCalendarUnit fromDate:[NSDate dateWithTimeIntervalSince1970:0] toDate:[NSDate date] options:0];NSLog(@"number of years:%i", dateComponents.year);
NSCalendar中比較重要的方法和概念firstWeekday

firstWeekday是大家比較容易渾淆的東西。

大家在使用dateComponents.weekday擷取某天對應的星期時,會發現,星期日對應的值為1,星期一對應的值為2,星期二對應的值為3,依次遞推,星期六對應的值為7,這與我們平時理解的方式不一樣。然後,我們就開始找是不是可以設定這種對應關係。終於,我們在NSCalendar中發現了firstWeekday這個變數,從字面意思上看貌似就是我們尋找的那個東西。可是,設定過firstWeekday後,我們又發現完全沒有作用,真是鬱悶啊!其實,大家不必鬱悶,因為鬱悶也沒用,iOS中規定的就是周日為1,周一為2,周二為3,周三為4,周四為5,周五為6,周六為7,無法通過某個設定改變這個事實的,只能在使用的時候注意一下這個規則了。那firstWeekday是幹什麼用的呢?大家設定一下firstWeekday,再擷取一下dateComponents.weekOfYear或dateComponents.weekOfMonth,看看返回的資料是否發生了變化。firstWeekday的作用確實是修改當前曆法中周的起始位置,但是不能修改周日對應的數值,只能修改一年或一個月中周的數量,以及周的次序。

-(NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;答疑解惑:
  1. Unit:單元

  2. NSRange:

    typedef struct _NSRange {

        NSUInteger location;NSUInteger length;

    } NSRange;

我們大致可以理解為:某個時間點所在的“小單元”,在“大單元”中的數量(傳回值range的location屬性變數的值一般是錯誤的)。例如:

            <!-- lang: cpp -->    //  目前時間對應的月份中有幾天    [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].length;    //  目前時間對應的月份中有幾周(前面說到的firstWeekday會影響到這個結果)    [[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].length;
-(NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;

我們大致可以理解為:某個時間點所在的“小單元”,在“大單元”中的位置(從1開始)。例如:

           <!-- lang: cpp -->    //  目前時間對應的周是當前年中的第幾周    [[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekOfYearCalendarUnit inUnit:NSYearCalendarUnit forDate:self];    [[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekCalendarUnit inUnit:NSYearCalendarUnit forDate:[NSDate date]];    //  目前時間對應的周是當前月中的第幾周    [[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekOfMonthCalendarUnit inUnit:NSYearCalendarUnit forDate:self];    [[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]];

在這裡:NSWeekOfYearCalendarUnit, NSWeekOfMonthCalendarUnit與NSWeekCalendarUnit的使用結果相同,為了避免渾淆,建議在此處使用NSWeekCalendar,而定義NSDateComponents時使用NSWeekOfYearCalendarUnit和NSWeekOfMonthCalendarUnit。

-(BOOL)rangeOfUnit:(NSCalendarUnit)unit startDate:(NSDate * )datep interval:(NSTimeInterval )tip forDate:(NSDate *)date;

我們大致可以理解為:“某個時間點”所在的“單元”的起始時間,以及起始時間距離“某個時間點”的時差(單位秒)。例如:

    <!-- lang: cpp -->    NSDate *startDateOfYear;    NSDate *startDateOfMonth;    NSDate *startDateOfWeek;    NSDate *startDateOfDay;    NSTimeInterval TIOfYear;    NSTimeInterval TIOfMonth;    NSTimeInterval TIOfWeek;    NSTimeInterval TIOfDay;    [[NSCalendar currentCalendar] rangeOfUnit:NSYearCalendarUnit startDate:&startDateOfYear interval:&TIOfYear forDate:[NSDate date]];    [[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&startDateOfMonth interval:&TIOfMonth forDate:[NSDate date]];    [[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit startDate:&startDateOfWeek interval:&TIOfWeek forDate:[NSDate date]];    [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&startDateOfDay interval:&TIOfDay forDate:[NSDate date]];    NSLog(@"firstDateOfYear:%@, FirstDateOfMonth:%@, FirstDateOfWeek:%@, FirstDateOfDay:%@", startDateOfYear, startDateOfMonth, startDateOfWeek, startDateOfDay);    NSLog(@"TIOfYear:%f, TIOfMonth:%f, TIOfWeek:%f, TIOfDay:%f", TIOfYear, TIOfMonth, TIOfWeek, TIOfDay);

關於NSCalendar和NSDateComponents的介紹暫時說到這裡。 

ios--NSCalendar NSDateComponents

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.