系统中定义的日历有:
NSString * const NSGregorianCalendar; | 公历(常用) |
NSString * const NSBuddhistCalendar; | 佛教日历 |
NSString * const NSChineseCalendar; | 中国农历(常用) |
NSString * const NSHebrewCalendar; | 希伯来日历 |
NSString * const NSIslamicCalendar; | 伊斯兰历 |
NSString * const NSIslamicCivilCalendar; | 伊斯兰教日历 |
NSString * const NSJapaneseCalendar; | 日本日历(和历,常用) |
NSString * const NSRepublicOfChinaCalendar; | 中华民国日历(台湾) |
NSString * const NSPersianCalendar; | 波斯历 |
NSString * const NSIndianCalendar; | 印度日历 |
NSString * const NSISO8601Calendar; | ISO8601(但是现在还不可用) |
得到某两个日期之间的年月日
NSDate *toDate = [NSDate dateWithTimeIntervalSince1970:0];
NSDate* startDate = [NSDate date];
//设定为公历
NSCalendar* chineseClendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSUInteger unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit;
NSDateComponents *cps = [chineseClendar components:unitFlags fromDate:toDate toDate:startDate options:0];
NSInteger diffHour = [cps hour];
NSInteger diffMin = [cps minute];
NSInteger diffSec = [cps second];
NSInteger diffDay = [cps day];
NSInteger diffMon = [cps month];
NSInteger diffYear = [cps year];
//+ currentCalendar //取得当前用户的逻辑日历 //currentCalendar取得的值会一直保持在cache中,第一次取得以后如果用户修改该系统日历设定,这个值也不会改变。 NSCalendar *calendar = [NSCalendar currentCalendar]; NSLog(@"calendar = %@",calendar); //+ (id)autoupdatingCurrentCalendar //取得当前用户的逻辑日历 //用autoupdatingCurrentCalendar,那么每次取得的值都会是当前系统设置的日历的值。 NSString *autoupdatingCurrent = [NSCalendar autoupdatingCurrentCalendar]; NSLog(@"autoupdatingCurrent = %@",autoupdatingCurrent);
- (void)updateWeek{
//如果想要用公历的时候,就要将NSDateFormatter的日历设置成公历。否则随着用户的系统设置的改变,取得的日期的格式也会不一样。
NSCalendar *initCalendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setCalendar:initCalendar];
[initCalendar setFirstWeekday:1];
[initCalendar setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
[initCalendar setMinimumDaysInFirstWeek:7];
[initCalendar setTimeZone:[NSTimeZone defaultTimeZone]];
//返回日历标示符
NSString *calendarIdentifier = [initCalendar calendarIdentifier];
NSLog(@"calendarIdentifier = %@",calendarIdentifier);
//– firstWeekday
//返回日历指定的每周的第一天从星期几开始。缺省为星期天,即firstWeekday = 1
int firstWeekday = [initCalendar firstWeekday];
NSLog(@"firstWeekday = %d",firstWeekday);
// 返回日历指定的地区信息。
NSLocale *locale = [initCalendar locale];
NSLog(@"locale = %@",locale.localeIdentifier);
//– maximumRangeOfUnit: //返回单元的最大范围
//- minimumRangeOfUnit: //返回单元的最小范围
//比如Day Calendar Unit就是一个月最多31天这个意思
NSRange range = [initCalendar maximumRangeOfUnit:NSDayCalendarUnit];
NSLog(@"range = %d",range.length);
//- minimumDaysInFirstWeek
//返回日历指定的第一周必须包含的最少天数。
int minimumDays = [initCalendar minimumDaysInFirstWeek];
NSLog(@"minimumDays = %d",minimumDays);
//- ordinalityOfUnit:inUnit:forDate:
//在一个给定的时间,小日历单元如(一天)在大日历单元(一周)中的序数。
//比如forDate参数是星期一,而且firstWeekday 参数被设置为2(也就是星期一为一周的第一天),那么返回为1
//通过这个函数可以判断 例如 :给定的日期是在一周的第几天,或一月的第几周。一年的第几个月。一年的第几天等
//注:firstWeekday的设定会影响这个函数的返回值
int ordinality = [initCalendar ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:[NSDate date]];
NSLog(@"ordinality = %d",ordinality);
//- rangeOfUnit:inUnit:forDate:
//一个小日历单元下。大日历单元的范围 例如 小日历单元是天。大日历单元是周。那么范围就是7天。就是1-7
NSRange rangeOfUnit = [initCalendar rangeOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:[NSDate date]];
NSLog(@"rangeOfUnit = %d",rangeOfUnit.length);
//如果startDate和interval均为可计算的,那么函数返回YES否则返回NO.比如:
NSDate *dateOut = [NSDate date];
// NSDate **sDate = &dateOut;
NSDateComponents *dc = [[NSDateComponents alloc] init];
[dc setYear: 2013];
[dc setMonth: 4];
[dc setDay: 6];
NSDate *date = [initCalendar dateFromComponents:dc];
NSTimeInterval intOut;
NSTimeInterval *intervalOut = &intOut;
if ([initCalendar rangeOfUnit:NSWeekCalendarUnit startDate:&dateOut interval:intervalOut forDate:date]){
NSLog(@"%@", [dateOut description]);
NSLog(@"%f", *intervalOut/60/60/24);
}
else{
NSLog(@"Can not be calculated!");
}
//- timeZone:
//返回日历指定的时区信息。
NSTimeZone *timeZone = [initCalendar timeZone];
NSLog(@"timeZone = %@",timeZone.abbreviation);
//- components:fromDate:
//返回时间组件
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *comps = [initCalendar components:unitFlags fromDate:[NSDate date]];
NSLog(@"NSDateComponents - %d",comps.year);
//- dateByAddingComponents:toDate:options:
//追加日期 并返回一个新日期
//
NSDate *currentDate = [NSDate date];
NSDateComponents *comps3 = [[NSDateComponents alloc] init];
[comps3 setMonth:2];
[comps3 setDay:3];
NSDate *newDate = [initCalendar dateByAddingComponents:comps3 toDate:currentDate options:0];
NSLog(@"newDate = %@",newDate);
}
参考文章: Cocoa Foundation框架学习笔记 - NSCalendar Cocoa中对日期和时间的处理 NSCalendar (一) NSCalendar 日历类