IOS開(kāi)發(fā)之時(shí)間與日期處理(深入)

之前一篇文章寫(xiě)的是時(shí)間與日期處理的簡(jiǎn)單模式,這篇文章就算是拓展的模式吧。

上一篇文章的地址是——IOS開(kāi)發(fā)之時(shí)間與日期處理(簡(jiǎn)單)

本文主要涉及的是:

NSTimeZone -- 時(shí)區(qū)信息
NSLocale -- 本地化信息
NSDateComponents -- 一個(gè)封裝了具體年月日、時(shí)秒分、周、季度等的類
NSCalendar -- 日歷類,它提供了大部分的日期計(jì)算接口,并且允許您在NSDate和NSDateComponents之間轉(zhuǎn)換


NSTimeZone介紹

NSTimeZone表示時(shí)區(qū)信息。 有下面幾種初始化方法:

1. + (id)timeZoneWithName:(NSString *)aTimeZoneName / - (id)initWithName:(NSString *)aName

根據(jù)時(shí)區(qū)名稱初始化。可以調(diào)用NSTimeZone的類方法 + (NSArray *)knownTimeZoneNames來(lái)返回所有已知的時(shí)區(qū)名稱。

NSTimeZone *zone = [[NSTimeZone alloc] initWithName:@"America/Chicago"];
//NSTimeZone *zone = [NSTimeZone timeZoneWithName:@"America/Chicago"];
NSLog(@"%@",zone);

打印出:America/Chicago (CST) offset -21600

*2. + (id)timeZoneWithAbbreviation:(NSString )abbreviation
根據(jù)時(shí)區(qū)縮寫(xiě)初始化。例如:EST(美國(guó)東部標(biāo)準(zhǔn)時(shí)間)、HKT(香港標(biāo)準(zhǔn)時(shí)間)

NSTimeZone *zone = [NSTimeZone timeZoneWithAbbreviation:@"EST"];
NSLog(@"%@",zone);

打印出:Asia/Hong_Kong (HKT) offset 28800

*3. + (NSTimeZone )systemTimeZone
返回系統(tǒng)時(shí)區(qū)

NSTimeZone *zone = [NSTimeZone systemTimeZone];
NSLog(@"%@",zone);

假如時(shí)區(qū)是上海,打印出的時(shí)區(qū)信息將會(huì)是:Asia/Shanghai (CST (China)) offset 28800,28800代表相對(duì)于GMT時(shí)間偏移的秒數(shù),即8個(gè)小時(shí)。(8*60*60)

*4. + (NSTimeZone )localTimeZone
返回本地時(shí)區(qū),與systemTimeZone的區(qū)別在于:本地時(shí)區(qū)可以被修改,而系統(tǒng)時(shí)區(qū)不能修改。

[NSTimeZone setDefaultTimeZone:[[NSTimeZone alloc] initWithName:@"America/Chicago"]];
NSTimeZone *systemZone = [NSTimeZone systemTimeZone];
NSTimeZone *localZone = [NSTimeZone localTimeZone];
NSLog(@"%@",systemZone);
NSLog(@"%@",localZone);

打印出的系統(tǒng)時(shí)區(qū)仍然是:Asia/Shanghai (CST (China)) offset 28800;而本地時(shí)區(qū)經(jīng)過(guò)修改后,變成了:Local Time Zone (America/Chicago (CST) offset -21600)

5. + (id)timeZoneForSecondsFromGMT:(NSInteger)seconds
根據(jù)零時(shí)區(qū)的秒數(shù)偏移返回一個(gè)新時(shí)區(qū)對(duì)象

NSTimeZone *zone = [NSTimeZone timeZoneForSecondsFromGMT:28800];
NSLog(@"%@",zone);

打印出:GMT+0800 (GMT+08:00) offset 28800

NSTimeZone常用對(duì)象方法與類方法:

*1. + (NSArray )knownTimeZoneNames
以數(shù)組的形式返回所有已知的時(shí)區(qū)名稱

NSArray *zoneArray = [NSTimeZone knownTimeZoneNames];
for(NSString *str in zoneArray){ 
     NSLog(@"%@",str);
}

2. - (NSString *)name / - (NSString *)abbreviation
返回時(shí)區(qū)對(duì)象的名稱或縮寫(xiě)

NSTimeZone *zone = [NSTimeZone localTimeZone];
NSString *strZoneName = [zone name];
NSString *strZoneAbbreviation = [zone abbreviation];
NSLog(@"name is %@",strZoneName);
NSLog(@"abbreviation is %@",strZoneAbbreviation);

打印結(jié)果為 name is Asia/Hong_Kong
abbreviation is HKT

3. - (NSInteger)secondsFromGMT
得到當(dāng)前時(shí)區(qū)與零時(shí)區(qū)的間隔秒數(shù)

NSTimeZone *zone = [NSTimeZone localTimeZone];
int seconds = [zone secondsFromGMT];
NSLog(@"%i",seconds);

NSLoale介紹

NSLoale類返回本地化信息,主要體現(xiàn)在"語(yǔ)言"和"區(qū)域格式"這兩個(gè)設(shè)置項(xiàng)。有下面幾種初始化方法:

1. + (id)systemLocale
返回系統(tǒng)初始本地化信息

NSLocale *locale = [NSLocale systemLocale];
NSLog(@"%@",[[locale objectForKey:NSLocaleCalendar] calendarIdentifier]);

2. + (id)currentLocale / + (id)autoupdatingCurrentLocale
這兩個(gè)類方法都將返回當(dāng)前客戶端的本地化信息,區(qū)別在于:currentLocale取得的值會(huì)一直保持在cache中,第一次用此方法實(shí)例化對(duì)象后,即使修改了本地化設(shè)定,這個(gè)對(duì)象也不會(huì)改變。而使用autoupdatingCurrentLocale,當(dāng)每次修改本地化設(shè)定,其實(shí)例化的對(duì)象也會(huì)隨之改變。
下面的代碼演示了區(qū)別所在,假設(shè)初始本地化信息為en_US,先用這兩個(gè)函數(shù)分別初始化兩個(gè)對(duì)象,然后修改本地化設(shè)定語(yǔ)言為臺(tái)灣繁體中文,再重新打印這兩個(gè)對(duì)象的信息:

NSLocale *locale1;
NSLocale *locale2;
- (IBAction)doTest:(id)sender {
    locale1 = [NSLocale currentLocale];
    locale2 = [NSLocale autoupdatingCurrentLocale]; 
    NSLog(@"%@",locale1.localeIdentifier); 
    //print "en_US" NSLog(@"%@",locale2.localeIdentifier); 
    //print "en_US"
}
- (IBAction)doAgain:(id)sender { 
    NSLog(@"%@",locale1.localeIdentifier); 
    //print "en_US" NSLog(@"%@",locale2.localeIdentifier); 
    //print "zh_TW"
}

*3. - (id)initWithLocaleIdentifier:(NSString )string
用標(biāo)示符初始化本地化信息

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
NSString *strSymbol = [locale objectForKey:NSLocaleCurrencySymbol];
NSLog(@"%@",strSymbol);

代碼用"zh_CN"來(lái)初始化對(duì)象,然后再打印出對(duì)象的貨幣符號(hào),得到的結(jié)果是人民幣符號(hào)¥

NSLoale常用對(duì)象方法與類方法:

1. - (id)objectForKey:(id)key
根據(jù)不同的key返回各種本地化信息,例如下面的代碼返回了當(dāng)前貨幣符號(hào):

NSLocale *locale = [NSLocale currentLocale];
NSString *strSymbol = [locale objectForKey:NSLocaleCurrencySymbol];
NSCalendar *calendar = [[NSLocale currentLocale] objectForKey:NSLocaleCalendar];

*2. - (NSString )displayNameForKey:(id)key value:(id)value
顯示特定地區(qū)代號(hào)下相應(yīng)鍵的顯示名稱:

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
NSString *str = [locale displayNameForKey:NSLocaleIdentifier value:@"en_US"];
NSLog(@"%@",str);

第一句代碼代表以中文來(lái)實(shí)例化對(duì)象,然后得到"en_US"的NSLocaleIdentifier鍵的顯示名稱。最后輸出的結(jié)果是"英文(美國(guó))"


NSDateComponents介紹

NSDateComponents封裝了具體年月日、時(shí)秒分、周、季度等

NSDateComponents *compt = [[NSDateComponents alloc] init];[compt setEra:1];
[compt setYear:2013];
[compt setMonth:3];
[compt setDay:15];
[compt setHour:11];
[compt setMinute:20];
[compt setSecond:55];
[compt setQuarter:2];
[compt setTimeZone:[NSTimeZone systemTimeZone]];
[compt setWeek:3];
[compt setWeekday:4];
[compt setWeekOfMonth:3];
[compt setWeekOfYear:2];
[compt setCalendar:[NSCalendar currentCalendar]];

NSDateComponents相關(guān)方法:

1. - (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)date

取得一個(gè)NSDate對(duì)象的1個(gè)或多個(gè)部分,用NSDateComponents來(lái)封裝

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [NSDate date];
//NSDateComponents *compt = [calendar components:NSDayCalendarUnit fromDate:date];
NSDateComponents *compt = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:date];
NSLog(@"%d,%@",[compt year],date);
NSLog(@"%d,%@",[compt month],date);
NSLog(@"%d,%@",[compt day],date);

需要注意的是,只有明確指定了unitFlags,NSDateComponents相應(yīng)的那一部分才有值。

2. - (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options : (NSUInteger)opts
取得兩個(gè)NSDate對(duì)象的時(shí)間間隔,用NSDateComponents來(lái)封裝

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [NSDate date];
NSDate *date2 = [NSDate dateWithTimeInterval:5*60*60+75 sinceDate:date];
NSDateComponents *compt = [calendar components:(NSMinuteCalendarUnit|NSSecondCalendarUnit) fromDate:date toDate:date2 options:0];
NSLog(@"%d",[compt minute]);
NSLog(@"%d",[compt second]);

有幾點(diǎn)需要注意
① 得到的NSDateComponents對(duì)象可能會(huì)包含負(fù)數(shù)。例如:當(dāng)toDate比f(wàn)romDate晚10秒,second部分返回10;當(dāng)toDate比f(wàn)romDate早10秒,second部分返回-10
② 當(dāng)指定unitFlags返回多個(gè)部分時(shí),相隔的時(shí)間由多個(gè)部分共同組成(而不是獨(dú)立去表示)。例如:上面的例子時(shí)間相差5小時(shí)1分15秒,如果指定只返回second部分,將得到18075秒;如果指定返回minute和second部分,將得到301分15秒;如果指定返回hour、minute和second,將得到5小時(shí)1分15秒。

3. - (NSDate *)dateFromComponents:(NSDateComponents *)comps
根據(jù)NSDateComponents對(duì)象得到一個(gè)NSDate對(duì)象

NSDateComponents *compt = [[NSDateComponents alloc] init];
[compt setYear:2012];
[compt setMonth:5];
[compt setDay:11];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [calendar dateFromComponents:compt];
//得到本地時(shí)間,避免時(shí)區(qū)問(wèn)題
NSTimeZone *zone = [NSTimeZone systemTimeZone];
NSInteger interval = [zone secondsFromGMTForDate:date];
NSDate *localeDate = [date dateByAddingTimeInterval:interval];
NSLog(@"%@",localeDate);

4. - (NSDate *)dateByAddingComponents:(NSDateComponents *)comps toDate:(NSDate *)date options:(NSUInteger)opts
在參數(shù)date基礎(chǔ)上,增加一個(gè)NSDateComponents類型的時(shí)間增量

NSDateComponents *compt = [[NSDateComponents alloc] init];
[compt setDay:25];
[compt setHour:4];
[compt setMinute:66];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [calendar dateByAddingComponents:compt toDate:[NSDate date] options:0]; 
//得到本地時(shí)間,避免時(shí)區(qū)問(wèn)題
NSTimeZone *zone = [NSTimeZone systemTimeZone];
NSInteger interval = [zone secondsFromGMTForDate:date];
NSDate *localeDate = [date dateByAddingTimeInterval:interval];
NSLog(@"%@",localeDate);

當(dāng)前時(shí)間的基礎(chǔ)上,增加25天4小時(shí)66秒


NSCalendar介紹

這是一個(gè)日歷類,可以處理日歷的相關(guān)問(wèn)題

1. + (id)currentCalendar / + (id)autoupdatingCurrentCalendar
這兩個(gè)類方法都將返回當(dāng)前客戶端的邏輯日歷,區(qū)別在于:currentCalendar取得的值會(huì)一直保持在cache中,第一次用此方法實(shí)例化對(duì)象后,即使修改了系統(tǒng)日歷設(shè)定,這個(gè)對(duì)象也不會(huì)改變。而使用autoupdatingCurrentCalendar,當(dāng)每次修改系統(tǒng)日歷設(shè)定,其實(shí)例化的對(duì)象也會(huì)隨之改變。

下面的代碼演示了區(qū)別所在,假設(shè)初始Calendar設(shè)定為NSGregorianCalendar(公歷),先用這兩個(gè)函數(shù)分別初始化兩個(gè)對(duì)象,然后修改系統(tǒng)日歷為NSJapaneseCalendar(日本和歷),再重新打印這兩個(gè)對(duì)象的信息:

NSCalendar *calendar;
NSCalendar *calendar2;

- (IBAction)doTest:(id)sender { 
    calendar = [NSCalendar currentCalendar]; calendar2 = [NSCalendar autoupdatingCurrentCalendar]; 
    NSLog(@"%@",calendar.calendarIdentifier);
    //print "gregorian" NSLog(@"%@",calendar2.calendarIdentifier); 
    //print "gregorian"
}

- (IBAction)doAgain:(id)sender { 
  NSLog(@"%@",calendar.calendarIdentifier); 
  //print "gregorian"     
  NSLog(@"%@",calendar2.calendarIdentifier); 
  //print "japanese"
}

*2. - (id)initWithCalendarIdentifier:(NSString )string
根據(jù)提供的日歷標(biāo)示符初始化

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSChineseCalendar];
NSLog(@"%@",calendar.calendarIdentifier);

系統(tǒng)中定義的日歷有:
NSGregorianCalendar -- 公歷(常用)
NSBuddhistCalendar -- 佛教日歷
NSChineseCalendar -- 中國(guó)農(nóng)歷(常用)
NSHebrewCalendar -- 希伯來(lái)日歷
NSIslamicCalendar -- 伊斯蘭歷
NSIslamicCivilCalendar -- 伊斯蘭教日歷
NSJapaneseCalendar -- 日本日歷(和歷,常用)
NSRepublicOfChinaCalendar -- 中華民國(guó)日歷(臺(tái)灣)
NSPersianCalendar -- 波斯歷
NSIndianCalendar -- 印度日歷
NSISO8601Calendar -- ISO8601(但是現(xiàn)在還不可用)

NSCalendar常用對(duì)象方法與類方法:

*1. - (void)setLocale:(NSLocale )locale
設(shè)置本地化信息

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[calendar setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"]];
NSLog(@"%@",calendar.locale.localeIdentifier);

*2. - (void)setTimeZone:(NSTimeZone )tz
設(shè)置時(shí)區(qū)信息

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[calendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"HKT"]];
NSLog(@"%@",calendar.timeZone);

3. - (void)setFirstWeekday:(NSUInteger)weekday
設(shè)置每周的第一天從星期幾開(kāi)始,比如:1代表星期日開(kāi)始,2代表星期一開(kāi)始,以此類推。默認(rèn)值是1
如圖所示,如果從星期天開(kāi)始,日歷的表現(xiàn)形式:


如果從星期二開(kāi)始,日歷的表現(xiàn)形式:

NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setFirstWeekday:3];
NSLog(@"%i",calendar.firstWeekday);

4. - (void)setMinimumDaysInFirstWeek:(NSUInteger)mdw
設(shè)置每年及每月第一周必須包含的最少天數(shù),比如:設(shè)定第一周最少包括3天,則value傳入3

NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setMinimumDaysInFirstWeek:3];
NSLog(@"%i",calendar.minimumDaysInFirstWeek);

5. - (NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date
獲取一個(gè)小的單位在一個(gè)大的單位里面的序數(shù)

NSCalendarUnit包含的值有:

NSEraCalendarUnit -- 紀(jì)元單位。對(duì)于NSGregorianCalendar(公歷)來(lái)說(shuō),只有公元前(BC)和公元(AD);而對(duì)于其它歷法可能有很多,例如日本和歷是以每一代君王統(tǒng)治來(lái)做計(jì)算。
NSYearCalendarUnit -- 年單位。值很大,相當(dāng)于經(jīng)歷了多少年,未來(lái)多少年。
NSMonthCalendarUnit -- 月單位。范圍為1-12NSDayCalendarUnit -- 天單位。范圍為1-31
NSHourCalendarUnit -- 小時(shí)單位。范圍為0-24
NSMinuteCalendarUnit -- 分鐘單位。范圍為0-60
NSSecondCalendarUnit -- 秒單位。范圍為0-60
NSWeekCalendarUnit -- 周單位。范圍為1-53
NSWeekdayCalendarUnit -- 星期單位,每周的7天。范圍為1-7
NSWeekdayOrdinalCalendarUnit -- 沒(méi)完全搞清楚
NSQuarterCalendarUnit -- 幾刻鐘,也就是15分鐘。范圍為1-4
NSWeekOfMonthCalendarUnit -- 月包含的周數(shù)。最多為6個(gè)周
NSWeekOfYearCalendarUnit -- 年包含的周數(shù)。最多為53個(gè)周
NSYearForWeekOfYearCalendarUnit -- 沒(méi)完全搞清楚
NSTimeZoneCalendarUnit -- 沒(méi)完全搞清楚

下面是一些示例:
① 當(dāng)小單位為NSWeekdayCalendarUnit,大單位為NSWeekCalendarUnit時(shí)(即某個(gè)日期在這一周是第幾天),根據(jù)firstWeekday屬性不同,返回的結(jié)果也不同。

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:10];
 //[calendar setFirstWeekday:2];
int count = [calendar ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:date];
NSLog(@"%d",count);

默認(rèn)firstWeekday為1(星期天開(kāi)始)的情況下,得到的結(jié)果是2,從下圖可以看到是第2天。



假如firstWeekday被設(shè)置為2(星期一開(kāi)始)的情況下,得到的結(jié)果是1,從下圖可以看到是第1天



② 當(dāng)小單位為NSWeekCalendarUnit,大單位為NSYearCalendarUnit時(shí)(即某個(gè)日期在這一年中是第幾周),根據(jù)minimumDaysInFirstWeek屬性不同,返回的結(jié)果也不同。
NSDateComponents *compt = [[NSDateComponents alloc] init];
[compt setYear:2013];
[compt setMonth:1];
[compt setDay:20];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [calendar dateFromComponents:compt];
//[calendar setMinimumDaysInFirstWeek:6];
int count = [calendar ordinalityOfUnit:NSWeekCalendarUnit inUnit:NSYearCalendarUnit forDate:date];
NSLog(@"%d",count);

從上圖的日歷中可以看出,在沒(méi)有設(shè)置minimumDaysInFirstWeek的情況下,1月20日得到的結(jié)果是4(第四個(gè)周)。
默認(rèn)情況下第一個(gè)周有5天,如果將minimumDaysInFirstWeek設(shè)置為6天,則原本是第一周的1月1日--1月5日被劃分到了上一年,返回0;而1月6日--1月12日升為第一周,1月13日--1月19日升為第二周,依此類推。所以需要關(guān)注的是minimumDaysInFirstWeek與實(shí)際第一周包含天數(shù)的大小比較,如果提供的minimumDaysInFirstWeek比實(shí)際第一周的天數(shù)小,則一切不變;否則統(tǒng)計(jì)"一年中第幾周"、"一個(gè)月中第幾周"的時(shí)候會(huì)產(chǎn)生變化。

6. -(NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date
根據(jù)參數(shù)提供的時(shí)間點(diǎn),得到一個(gè)小的單位在一個(gè)大的單位里面的取值范圍

NSDateComponents *compt = [[NSDateComponents alloc] init];
[compt setYear:2013];
[compt setMonth:2];
[compt setDay:21];
[compt setHour:9];
[compt setMinute:45];
[compt setSecond:30];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [calendar dateFromComponents:compt];
//得到本地時(shí)間,避免時(shí)區(qū)問(wèn)題
NSTimeZone *zone = [NSTimeZone systemTimeZone];
NSInteger interval = [zone secondsFromGMTForDate:date];
NSDate *localeDate = [date dateByAddingTimeInterval:interval];
NSRange range = [calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:localeDate];
NSLog(@"%d -- %d",range.location,range.length);

調(diào)用這個(gè)方法要明確一點(diǎn),取得的是"范圍"而不是"包含",下面是一些例子:
① 小單位是NSDayCalendarUnit,大單位是NSYearCalendarUnit,并不是要取這一年包含多少天,而是要取"天"(Day)這個(gè)單位在這一年(Year)的取值范圍。其實(shí)不管你提供的日期是多少,返回的值都是"1--31"。

② 小單位是NSDayCalendarUnit,大單位是NSMonthCalendarUnit。要取得參數(shù)時(shí)間點(diǎn)所對(duì)應(yīng)的月份下,"天"(Day)的取值范圍。根據(jù)參數(shù)時(shí)間的月份不同,值也不同。例如2月是1--28、3月是1--31、4月是1--30。

③ 小單位是NSWeekCalendarUnit,大單位是NSMonthCalendarUnit。要取得參數(shù)時(shí)間點(diǎn)所對(duì)應(yīng)的月份下,"周"(Week)的取值范圍。需要注意的是結(jié)果會(huì)受到minimumDaysInFirstWeek屬性的影響。在默認(rèn)minimumDaysInFirstWeek情況下,取得的范圍值一般是"1--5",從日歷上可以看出來(lái)這個(gè)月包含5排,即5個(gè)周。

④ 小單位是NSDayCalendarUnit,大單位是NSWeekCalendarUnit。要取得周所包含的"天"(Day)的取值范圍。下面是一個(gè)示例日歷圖:



在上圖的日期條件下,假如提供的參數(shù)是4月1日--4月6日,那么對(duì)應(yīng)的week就是1(第一個(gè)周),可以看到第一個(gè)周包含有6天,從1號(hào)開(kāi)始,那么最終得到的范圍值為1--6。

假如提供的參數(shù)是4月18日,那么對(duì)應(yīng)的week是3(第三個(gè)周),第三個(gè)周包含有7天,從14號(hào)開(kāi)始,那么最終得到的范圍值是14--7。

假如提供的參數(shù)是4月30日,那么對(duì)應(yīng)的week是5(第五個(gè)周),第五個(gè)周只包含3天,從28號(hào)開(kāi)始,那么最終得到的范圍值是28--3。

7. - (BOOL)rangeOfUnit:(NSCalendarUnit)unit startDate:(NSDate *)datep interval:(NSTimeInterval *)tip forDate:(NSDate *)date
根據(jù)參數(shù)提供的時(shí)間點(diǎn),返回所在日歷單位的開(kāi)始時(shí)間。如果startDate和interval均可以計(jì)算,則返回YES;否則返回NO
unit -- 日歷單位datep -- 開(kāi)始時(shí)間,通過(guò)參數(shù)返回tip -- 日歷單位所對(duì)應(yīng)的秒數(shù),通過(guò)參數(shù)返回date -- 時(shí)間點(diǎn)參數(shù)

NSDate *dateOut = nil;
NSTimeInterval count = 0;
NSDateComponents *compt = [[NSDateComponents alloc] init];
[compt setYear:2013];
[compt setMonth:3];
[compt setDay:22];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [calendar dateFromComponents:compt];
BOOL b = [calendar rangeOfUnit:NSMonthCalendarUnit startDate:&dateOut interval:&count forDate:date];
if(b){ 
    //得到本地時(shí)間,避免時(shí)區(qū)問(wèn)題 
    NSTimeZone *zone = [NSTimeZone systemTimeZone]; 
    NSInteger interval = [zone secondsFromGMTForDate:dateOut]; 
    NSDate *localeDate = [dateOut dateByAddingTimeInterval:interval]; 
    NSLog(@"%@",localeDate);
    NSLog(@"%f",count);
}else{ 
    NSLog(@"無(wú)法計(jì)算");
}

上面的例子要求返回2013年3月22日當(dāng)月的起始時(shí)間,以及當(dāng)月的秒數(shù)。得到的結(jié)果是:2013-03-01 00:00:00 +0000,2678400。(2678400 = 31天 * 24小時(shí) * 60分 * 60秒)

假如將上面的日歷單位改為NSWeekCalendarUnit,那么得到的結(jié)果是:2013-03-17 00:00:00 +0000,604800。當(dāng)周的第一天是3月17日。(604800 = 7天 * 24小時(shí) * 60分 * 60秒)

假如將上面的日歷單位改為NSYearCalendarUnit,那么得到的結(jié)果是:2013-01-01 00:00:00 +0000,31536000。這一年的第一天是1月1日。(31536000 = 365天 * 24小時(shí) * 60分 * 60秒)

關(guān)于NSCalendar 的具體用法也可以參考——Cocoa Foundation框架學(xué)習(xí)筆記 - NSCalendar里邊有具體的代碼實(shí)現(xiàn)。

關(guān)于時(shí)間與日期的問(wèn)題暫且寫(xiě)到這里。
本文算是拓展的內(nèi)容,一般用不到這么深入,在上一篇簡(jiǎn)單模式中的東西差不多就夠用了。
說(shuō)實(shí)話,復(fù)制粘貼也是很累的啊——wayne23
目前寫(xiě)(copy)的東西,還有以后寫(xiě)(copy)的東西,基本都是為了自己能夠找的更方便而已,純粹是懶得,莫笑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容