NSCalendar + NSDateComponents

NSDateComponents

若獲取dateComponents對象時,設(shè)置components的時候未添加NSYearCalendarUnit,dateComponents.year將返回錯誤的數(shù)值,其他的也一樣,所以使用NSDateComponents表示時間時,要確保需要使用的數(shù)據(jù)都在componets中添加了。

One

    // 定義一個遵循某個歷法的日歷對象 NSGregorianCalendar國際歷法
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

    // 通過已定義的日歷對象,獲取某個時間點的NSDateComponents表示,并設(shè)置需要表示哪些信息(NSYearCalendarUnit, NSMonthCalendarUnit, NSDayCalendarUnit等)
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    NSInteger unitFlags = NSCalendarUnitEra |
    NSCalendarUnitYear |
    NSCalendarUnitMonth |
    NSCalendarUnitDay |
    NSCalendarUnitHour |
    NSCalendarUnitMinute |
    NSCalendarUnitSecond |
    NSCalendarUnitWeekday |
    NSCalendarUnitWeekdayOrdinal |
    NSCalendarUnitQuarter |
    NSCalendarUnitWeekOfMonth |
    NSCalendarUnitWeekOfYear |
    NSCalendarUnitYearForWeekOfYear |
    NSCalendarUnitNanosecond |
    NSCalendarUnitCalendar |
    NSCalendarUnitTimeZone;
    comps = [calendar components:unitFlags fromDate:[NSDate date]];
    
    NSLog(@"era(世紀(jì)): %li", (long)comps.era);
    NSLog(@"year(年份): %li", (long)comps.year);
    NSLog(@"quarter(季度):%li", (long)comps.quarter);
    NSLog(@"month(月份):%li", (long)comps.month);
    NSLog(@"day(日期):%li", (long)comps.day);
    NSLog(@"hour(小時):%li", (long)comps.hour);
    NSLog(@"minute(分鐘):%li", (long)comps.minute);
    NSLog(@"second(秒):%li", (long)comps.second);
    
    //    Sunday:1, Monday:2, Tuesday:3, Wednesday:4, Thursday:5, Friday:6, Saturday:7
    NSLog(@"weekday(星期):%li", (long)comps.weekday);
    
    //    蘋果官方不推薦使用week
    NSLog(@"week(該年第幾周):%li", (long)comps.week);
    NSLog(@"weekOfYear(該年第幾周):%li", (long)comps.weekOfYear);
    NSLog(@"weekOfMonth(該月第幾周):%li", (long)comps.weekOfMonth);
    NSLog(@"yearForWeekOfYear(年):%li", (long)comps.yearForWeekOfYear);//不是很明白其含義

Two

// 先定義一個遵循某個歷法的日歷對象
NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

// 定義一個NSDateComponents對象,設(shè)置一個時間點
NSDateComponents *dateComponentsForDate = [[NSDateComponents alloc] init];
[dateComponentsForDate setDay:6];
[dateComponentsForDate setMonth:5];
[dateComponentsForDate setYear:2004];

// 根據(jù)設(shè)置的dateComponentsForDate獲取歷法中與之對應(yīng)的時間點
// 這里的時分秒會使用NSDateComponents中規(guī)定的默認(rèn)數(shù)值,一般為0或1。
NSDate *dateFromDateComponentsForDate = [greCalendar dateFromComponents:dc];

// 定義一個NSDateComponents對象,設(shè)置一個時間段
NSDateComponents *dateComponentsAsTimeQantum = [[NSDateComponents alloc] init];
[dateComponentsAsTimeQantum setDay:6];

// 在當(dāng)前歷法下,獲取6天后的時間點
NSDate *dateFromDateComponentsAsTimeQantum = [greCalendar dateByAddingComponents:dateComponentsAsTimeQantum toDate:[NSDate date] options:0];

Three

// 先定義一個遵循某個歷法的日歷對象
NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

// 根據(jù)兩個時間點,定義NSDateComponents對象,從而獲取這兩個時間點的時差
NSDateComponents *dateComponents = [greCalendar components:NSYearCalendarUnit fromDate:[NSDate dateWithTimeIntervalSince1970:0] toDate:[NSDate date] options:0];
NSLog(@"number of years:%li", (long)dateComponents.year);

NSCalendar中比較重要的方法和概念

firstWeekday

firstWeekday是大家比較容易渾淆的東西。
大家在使用dateComponents.weekday獲取某天對應(yīng)的星期時,會發(fā)現(xiàn),星期日對應(yīng)的值為1,星期一對應(yīng)的值為2,星期二對應(yīng)的值為3,依次遞推,星期六對應(yīng)的值為7,這與我們平時理解的方式不一樣(歪果仁好像一周的開始就是周日,而不是周一)。然后,我們就開始找是不是可以設(shè)置這種對應(yīng)關(guān)系。終于,我們在NSCalendar中發(fā)現(xiàn)了firstWeekday這個變量,從字面意思上看貌似就是我們尋找的那個東西??墒?,設(shè)置過firstWeekday后,我們又發(fā)現(xiàn)完全沒有作用,真是郁悶??!其實,大家不必郁悶,因為郁悶也沒用,iOS中規(guī)定的就是周日為1,周一為2,周二為3,周三為4,周四為5,周五為6,周六為7,無法通過某個設(shè)置改變這個事實的,只能在使用的時候注意一下這個規(guī)則了。那firstWeekday是干什么用的呢?大家設(shè)置一下firstWeekday,再獲取一下dateComponents.weekOfYear或dateComponents.weekOfMonth,看看返回的數(shù)據(jù)是否發(fā)生了變化。firstWeekday的作用確實是修改當(dāng)前歷法中周的起始位置,但是不能修改周日對應(yīng)的數(shù)值,只能修改一年或一個月中周的數(shù)量,以及周的次序。

-(NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;

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

// 當(dāng)前時間對應(yīng)的月份中有幾天 
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].length; 

// 當(dāng)前時間對應(yīng)的月份中有幾周(前面說到的firstWeekday會影響到這個結(jié)果) 
[[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].length;
-(NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;

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

// 當(dāng)前時間對應(yīng)的周是當(dāng)前年中的第幾周 
[[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekOfYearCalendarUnit inUnit:NSYearCalendarUnit forDate:self]; 
[[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekCalendarUnit inUnit:NSYearCalendarUnit forDate:[NSDate date]]; 

// 當(dāng)前時間對應(yīng)的周是當(dāng)前月中的第幾周 
[[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekOfMonthCalendarUnit inUnit:NSYearCalendarUnit forDate:self]; 
[[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]];
-(BOOL)rangeOfUnit:(NSCalendarUnit)unit startDate:(NSDate **)datep interval:(NSTimeInterval *)tip forDate:(NSDate *)date;

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

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

參考的源文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容