Cocoa中对日期和时间的处理 NSCalendar (一)
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
....