自己是一個懶人,本來想寫一個完整的日歷demo貼出來的油坝,不過代碼太亂懶得整理了嫉戚,這里就給大家兩個地址大家自己看看吧,掌握日歷寫法足夠了
iOS日歷澈圈、NSCalendar初探(基礎(chǔ)篇)彬檀,基礎(chǔ)教學(xué)看這個
帶農(nóng)歷和節(jié)假日的萬年歷,這個陽歷農(nóng)歷節(jié)假日都全了
NSCalendar
NSCalendar
日歷類
Cocoa中對日期和時間的處理 NSCalendar (一)
NSCalendar用于處理時間相關(guān)問題瞬女。比如比較時間前后凤覆、計算日期所的周別等。
- 創(chuàng)建或初始化可用以下方法
+ (id)currentCalendar;
取得當(dāng)前用戶的邏輯日歷(logical calendar)
+ (id)autoupdatingCurrentCalendar;
取得當(dāng)前用戶的邏輯日歷(logical calendar), ......
- (id)initWithCalendarIdentifier:(NSString *)identifier;
初始化為各種日歷拆魏。identifier的范圍可以是:
NSGregorianCalendar 陽歷
NSBuddhistCalendar 佛歷
NSChineseCalendar 中國日歷
NSHebrewCalendar 希伯來日歷
NSIslamicCalendar 伊斯蘭日歷
NSIslamicCivilCalendar 伊斯蘭民事日歷
NSJapaneseCalendar 日本日歷
- 使用前若有必要可以先做以下設(shè)定
- (void)setLocale:(NSLocale *)locale;
設(shè)置區(qū)域
- (void)setTimeZone:(NSTimeZone *)tz;
設(shè)置時區(qū)
- (void)setFirstWeekday:(NSUInteger)value;
設(shè)定每周的第一天從星期幾開始盯桦,比如:
. 如需設(shè)定從星期日開始,則value傳入1
. 如需設(shè)定從星期一開始通砍,則value傳入2
. 以此類推
詳細(xì)信息請參閱FirstWeekday屬性
- (void)setMinimumDaysInFirstWeek:(NSUInteger)value;
設(shè)定作為(每年及每月)第一周必須包含的最少天數(shù)吮便,比如:
. 如需設(shè)定第一周最少包括7天运怖,則value傳入7
詳細(xì)信息請參閱MinimumDaysInFirstWeek屬性
- 取回設(shè)定信息用以下方法
- (NSString *)calendarIdentifier
返回日歷標(biāo)示符(identifier)。有效的日歷標(biāo)示符包括:
NSGregorianCalendar
NSBuddhistCalendar
NSChineseCalendar
NSHebrewCalendar
NSIslamicCalendar
NSIslamicCivilCalendar
NSJapaneseCalendar
- (NSLocale *)locale;
返回日歷指定的地區(qū)信息略号。它將影響???
- (NSTimeZone *)timeZone;
返回日歷指定的時區(qū)信息。它將影響???
- (NSUInteger)firstWeekday;
返回日歷指定的每周的第一天從星期幾開始洋闽。缺省為星期天玄柠,即firstWeekday = 1
當(dāng)方法[NSCalendar ordinalityOfUnit: inUnit: fromDate:]
的ordinalityOfUnit參數(shù)為NSWeekdayCalendarUnit,inUnit參數(shù)為NSWeekCalendarUnit時诫舅,
firstWeekday屬性影響它的返回值羽利。具體說明如下:
. 當(dāng)firstWeekday被指定為星期天(即 = 1)時,它返回的值與星期幾對應(yīng)的數(shù)值保持一致刊懈。比如:
fromDate傳入的參數(shù)是星期日这弧,則函數(shù)返回1
fromDate傳入的參數(shù)是星期一,則函數(shù)返回2
. 當(dāng)firstWeekday被指定為其它值時(即 <> 1)時虚汛,假設(shè)firstWeekday被指定為星期一(即 = 2)匾浪,那么:
fromDate傳入的參數(shù)是星期一,則函數(shù)返回1
fromDate傳入的參數(shù)是星期二卷哩,則函數(shù)返回2
fromDate傳入的參數(shù)是星期日蛋辈,則函數(shù)返回7
- (NSUInteger)minimumDaysInFirstWeek;
返回日歷指定的第一周必須包含的最少天數(shù)。缺省為1将谊,即minimumDaysInFirstWeek = 1冷溶。
當(dāng)方法[NSCalendar ordinalityOfUnit: inUnit: fromDate:]
的ordinalityOfUnit參數(shù)為NSWeekCalendarUnit,inUnit參數(shù)為NSYearCalendarUnit時瓢娜,
minimumDaysInFirstWeek屬性影響它的返回值挂洛。具體說明如下:
2005年1月
日 一 二 三 四 五 六
--------------------------------
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
2005年1月第一周包括1號。
a. 如果將minimumDaysInFirstWeek設(shè)定 = 1
則fromDate傳入1月1號眠砾,方法均返回1 ==> 滿足minimumDaysInFirstWeek指定的天數(shù)(最少1天)虏劲,所以方法將其歸為2005年的第1周
則fromDate傳入1月2-8號,方法均返回2
則fromDate傳入1月9-15號褒颈,方法均返回3
......
b. 如果將minimumDaysInFirstWeek設(shè)定為 > 1柒巫,比如2
則fromDate傳入1月1號,方法均返回53 ==> 不足2天谷丸,所以方法將其歸為2004年的第53周
則fromDate傳入1月2-8號堡掏,方法均返回1
則fromDate傳入1月9-15號,方法均返回2
......
2008年1月
日 一 二 三 四 五 六
---------------------------------
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
2005年1月第一周包括1-5號共5天刨疼。
a. 如果將minimumDaysInFirstWeek設(shè)定為 <= 5時
則fromDate傳入1月1-5號泉唁,方法均返回1 ==> 滿足minimumDaysInFirstWeek指定的天數(shù)鹅龄,所以方法將其歸為2008年的第1周
則fromDate傳入1月6-12號,方法均返回2
則fromDate傳入1月13-19號亭畜,方法均返回3
......
b. 如果將minimumDaysInFirstWeek設(shè)定為 > 5扮休,比如6
則fromDate傳入1月1-5號,方法均返回53 ==> 當(dāng)周不足6天拴鸵,所以方法將其歸為2007年的第53周
則fromDate傳入1月2-8號玷坠,方法均返回1
則fromDate傳入1月9-15號,方法均返回2
......
當(dāng)方法[NSCalendar ordinalityOfUnit: inUnit: fromDate:]
的ordinalityOfUnit參數(shù)為NSWeekCalendarUnit劲藐,inUnit參數(shù)為NSMonthCalendarUnit時八堡,
minimumDaysInFirstWeek屬性影響它的返回值。以2008年4月為例聘芜, 具體說明如下:
2008年4月
日 一 二 三 四 五 六
---------------------------------
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
2008年4月第一周包括1兄渺、2、3厉膀、4溶耘、5號。
1. 如果將minimumDaysInFirstWeek設(shè)定為小于或等于5的數(shù)
則fromDate傳入4月1-5號服鹅,方法均返回1
則fromDate傳入4月6-12號凳兵,方法均返回2
則fromDate傳入4月13-19號,方法均返回3
....
2. 如果將minimumDaysInFirstWeek設(shè)定為大于5的數(shù)
則fromDate傳入1-5號企软,方法均返回0
則fromDate傳入6-12號庐扫,方法均返回1
則fromDate傳入13-19號,方法均返回2
....
Cocoa中對日期和時間的處理 NSCalendar (二)
其他方法的說明
- (NSRange)maximumRangeOfUnit:(NSCalendarUnit)unit;
返回單元的最大范圍仗哨。就Gregorian來說有:
NSEraCalendarUnit => 0 - 2
NSYearCalendarUnit => 1 - 10000
NSMonthCalendarUnit = 1 - 12
NSDayCalendarUnit = 1 - 31
NSHourCalendarUnit = 0 - 24
NSMinuteCalendarUnit = 0 - 60
NSSecondCalendarUnit = 0 - 60
NSWeekCalendarUnit = 1 - 53
NSWeekdayCalendarUnit = 1 - 7
NSWeekdayOrdinalCalendarUnit = ? (2147483647 - 2147483647)
(NSNotFound - NSNotFound)
- (NSRange)minimumRangeOfUnit:(NSCalendarUnit)unit;
返回單元的最小范圍形庭。就Gregorian來說有:
NSEraCalendarUnit => 0 - 2
NSYearCalendarUnit => 1 - 10000
NSMonthCalendarUnit = 1 - 12
NSDayCalendarUnit = 1 - 28 ***
NSHourCalendarUnit = 0 - 24
NSMinuteCalendarUnit = 0 - 60
NSSecondCalendarUnit = 0 - 60
NSWeekCalendarUnit = 1 - 52 ***
NSWeekdayCalendarUnit = 1 - 7
NSWeekdayOrdinalCalendarUnit = ? (2147483647 - 2147483647)
(NSNotFound - NSNotFound)
- (NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date
返回某個特定時間(date)其對應(yīng)的小的時間單元(smaller)在大的時間單元(larger)中的順序,比如:
. 要取得2008/11/12在當(dāng)月的第幾周則可以這樣調(diào)用該方法:
[calendar ordinalityOfUnit:NSWeekOrdinalCalendarUnit inUnit: NSWeekCalendarUnit forDate: someDate];
注: someDate存放了2008/11/12
. 要取得1:50分在一天中處于第幾個小時厌漂,則可以這樣調(diào)用該方法:
[calendar ordinalityOfUnit:NSHourCalendarUnit inUnit: NSDayCalendarUnit forDate: someTime];
注: someTime存放了1:50
. 其它請參照firstWeekday和minimumDaysInFirstWeek中的說明
- (NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date
返回某個特定時間(date)其對應(yīng)的小的時間單元(smaller)在大的時間單元(larger)中的范圍萨醒,比如:
. 要取得2008/11/12在所在月份的日期范圍則可以這樣調(diào)用該方法:
[calendar ordinalityOfUnit:NSDayCalendarUnit inUnit: NSMonthCalendarUnit forDate:fDate];
則返回1-31。注: fDate存放了2008/11/12
. 要取得2008/02/20在所在月份的日期范圍則可以這樣調(diào)用該方法:
[calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:fDate];
則返回1-29苇倡。注: fDate存放了2008/11/12
- (BOOL)rangeOfUnit:(NSCalendarUnit)unit startDate:(NSDate **)sDate interval:(NSTimeInterval *)unitSecs forDate:(NSDate *)date;
用于返回日期date(參數(shù))所在的那個日歷單元unit(參數(shù))的開始時間(sDate)富纸。其中參數(shù)unit指定了日歷單元,參數(shù)sDate用于返回日歷單元的第一天旨椒,參數(shù)unitSecs用于返回日歷單元的長度(以秒為單位)晓褪,參數(shù)date指定了一個特定的日期。
如果startDate和interval均為可計算的综慎,那么函數(shù)返回YES否則返回NO.比如:
. 要計算2008/01/08日所在的周的第一天:
...
NSDate *dateOut = [NSDate date];
NSDate **sDate = &dateOut;
NSDateComponents *dc = [[NSDateComponents alloc] init];
[dc setYear: 2008];
[dc setMonth: 1];
[dc setDay: 8];
NSDate *date = [calendar dateFromComponents:dc];
NSTimeInterval intOut;
NSTimeInterval *intervalOut = &intOut;
if ([calendar rangeOfUnit:NSMonthCalendarUnit startDate:sDate interval:interval0 forDate:date]){
NSLog(@"%@", [*sDate description]);
NSLog(@"%f", *intervalOut);
}
else{
NSLog(@"Can not be calculated!");
}
...
在控制臺窗口上可以看到:
2008-01-06 00:00:00 +0800
604800.000000
注: 2008-01-06是2008/01/08所在周的第一天涣仿,604800是一周7天的秒數(shù)。
. 要計算2008/01/05日所在的周的第一天示惊,在控制臺窗口上可以看到:
2007-12-30 00:00:00 +0800
604800.000000
. 要計算2008/02/06日所在的月的第一天好港,在控制臺窗口上可以看到:
2007-02-01 00:00:00 +0800
2505600.000000
注: 2505600是二月29天的秒數(shù)愉镰。