您的位置:首页 > 其它

NSCalendar 日历类

2015-10-23 18:35 190 查看
最近需要做一个日历控件,苦耐网上没有合适的demo那只能自己动手了,先学习一下NSCalendar吧!

以下内容摘自 http://www.cnblogs.com/wujian1360/archive/2011/09/05/2168007.html
Cocoa中对日期和时间的处理 NSCalendar (一) (2008-11-12 21:54:10)

NSCalendar用于处理时间相关问题。比如比较时间前后、计算日期所的周别等。

1. 创建或初始化可用以下方法

+ (id)currentCalendar;

取得当前用户的逻辑日历(logical calendar)

+ (id)autoupdatingCurrentCalendar;

取得当前用户的逻辑日历(logical calendar), ......

- (id)initWithCalendarIdentifier:(NSString *)identifier;

初始化为各种日历。identifier的范围可以是:

NSGregorianCalendar 阳历

NSBuddhistCalendar 佛历

NSChineseCalendar 中国日历

NSHebrewCalendar 希伯来日历

NSIslamicCalendar 伊斯兰日历

NSIslamicCivilCalendar 伊斯兰民事日历

NSJapaneseCalendar 日本日历

2. 使用前若有必要可以先做以下设定

- (void)setLocale:(NSLocale *)locale;

设置区域

- (void)setTimeZone:(NSTimeZone *)tz;

设置时区

- (void)setFirstWeekday:(NSUInteger)value;

设定每周的第一天从星期几开始,比如:

. 如需设定从星期日开始,则value传入1

. 如需设定从星期一开始,则value传入2

. 以此类推

详细信息请参阅FirstWeekday属性

- (void)setMinimumDaysInFirstWeek:(NSUInteger)value;

设定作为(每年及每月)第一周必须包含的最少天数,比如:

. 如需设定第一周最少包括7天,则value传入7

详细信息请参阅MinimumDaysInFirstWeek属性

3. 取回设定信息用以下方法

- (NSString *)calendarIdentifier

返回日历标示符(identifier)。有效的日历标示符包括:

NSGregorianCalendar

NSBuddhistCalendar

NSChineseCalendar

NSHebrewCalendar

NSIslamicCalendar

NSIslamicCivilCalendar

NSJapaneseCalendar

- (NSLocale *)locale;

返回日历指定的地区信息。它将影响???

- (NSTimeZone *)timeZone;

返回日历指定的时区信息。它将影响???

- (NSUInteger)firstWeekday;

返回日历指定的每周的第一天从星期几开始。缺省为星期天,即firstWeekday = 1

当方法[NSCalendar ordinalityOfUnit: inUnit: fromDate:]

的ordinalityOfUnit参数为NSWeekdayCalendarUnit,inUnit参数为NSWeekCalendarUnit时,

firstWeekday属性影响它的返回值。具体说明如下:

. 当firstWeekday被指定为星期天(即 = 1)时,它返回的值与星期几对应的数值保持一致。比如:

fromDate传入的参数是星期日,则函数返回1

fromDate传入的参数是星期一,则函数返回2

. 当firstWeekday被指定为其它值时(即 <> 1)时,假设firstWeekday被指定为星期一(即 =
2),那么:

fromDate传入的参数是星期一,则函数返回1

fromDate传入的参数是星期二,则函数返回2

fromDate传入的参数是星期日,则函数返回7

- (NSUInteger)minimumDaysInFirstWeek;

返回日历指定的第一周必须包含的最少天数。缺省为1,即minimumDaysInFirstWeek = 1。

当方法[NSCalendar ordinalityOfUnit: inUnit: fromDate:]

的ordinalityOfUnit参数为NSWeekCalendarUnit,inUnit参数为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设定 = 1

则fromDate传入1月1号,方法均返回1 ==> 满足minimumDaysInFirstWeek指定的天数(最少1天),所以方法将其归为2005年的第1周

则fromDate传入1月2-8号,方法均返回2

则fromDate传入1月9-15号,方法均返回3

......

b. 如果将minimumDaysInFirstWeek设定为 > 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设定为 <= 5时

则fromDate传入1月1-5号,方法均返回1 ==> 满足minimumDaysInFirstWeek指定的天数,所以方法将其归为2008年的第1周

则fromDate传入1月6-12号,方法均返回2

则fromDate传入1月13-19号,方法均返回3

......

b. 如果将minimumDaysInFirstWeek设定为 > 5,比如6

则fromDate传入1月1-5号,方法均返回53 ==> 当周不足6天,所以方法将其归为2007年的第53周

则fromDate传入1月2-8号,方法均返回1

则fromDate传入1月9-15号,方法均返回2

......

当方法[NSCalendar ordinalityOfUnit: inUnit: fromDate:]

的ordinalityOfUnit参数为NSWeekCalendarUnit,inUnit参数为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设定为小于或等于5的数

则fromDate传入4月1-5号,方法均返回1

则fromDate传入4月6-12号,方法均返回2

则fromDate传入4月13-19号,方法均返回3

....

2. 如果将minimumDaysInFirstWeek设定为大于5的数

则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)其对应的小的时间单元(smaller)在大的时间单元(larger)中的顺序,比如:

. 要取得2008/11/12在当月的第几周则可以这样调用该方法:

[calendar ordinalityOfUnit:NSWeekOrdinalCalendarUnit inUnit: NSWeekCalendarUnit forDate: someDate];

注: someDate存放了2008/11/12

. 要取得1:50分在一天中处于第几个小时,则可以这样调用该方法:

[calendar ordinalityOfUnit:NSHourCalendarUnit inUnit: NSDayCalendarUnit forDate: someTime];

注: someTime存放了1:50

. 其它请参照firstWeekday和minimumDaysInFirstWeek中的说明

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

返回某个特定时间(date)其对应的小的时间单元(smaller)在大的时间单元(larger)中的范围,比如:

. 要取得2008/11/12在所在月份的日期范围则可以这样调用该方法:

[calendar ordinalityOfUnit:NSDayCalendarUnit inUnit: NSMonthCalendarUnit forDate:fDate];

则返回1-31。注: fDate存放了2008/11/12

. 要取得2008/02/20在所在月份的日期范围则可以这样调用该方法:

[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(参数)所在的那个日历单元unit(参数)的开始时间(sDate)。其中参数unit指定了日历单元,参数sDate用于返回日历单元的第一天,参数unitSecs用于返回日历单元的长度(以秒为单位),参数date指定了一个特定的日期。

如果startDate和interval均为可计算的,那么函数返回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天的秒数。

. 要计算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天的秒数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: