NSCalendar 日历
/**1. System Locale Information
取得当前用户的逻辑日历(logical calendar) 两种类方法**/
// 1.1 取得当前用户的逻辑日历
// currentCalendar取得的值会一直保持在cache中,第一次取得以后如果用户修改该系统日历设定,这个值也不会改变。
NSCalendar *currentcalender = [NSCalendar currentCalendar];
NSLog(@"currentcalender = %@",currentcalender.calendarIdentifier);// currentcalender = gregorian
// 1.2 取得当前用户的逻辑日历
// 用autoupdatingCurrentCalendar,那么每次取得的值都会是当前系统设置的日历的值。
NSCalendar *calendar2 = [NSCalendar autoupdatingCurrentCalendar];
NSLog(@"calendar2 = %@",calendar2.calendarIdentifier); // calendar2 = gregorian
/** 2.Initializing a Calendar
2.1 - (id)initWithCalendarIdentifier:(NSString *)identifier;
初始化为各种日历。identifier的范围可以是:
NSGregorianCalendar 阳历
NSBuddhistCalendar 佛历
NSChineseCalendar 中国日历
NSHebrewCalendar 希伯来日历
NSIslamicCalendar 伊斯兰日历
NSIslamicCivilCalendar 伊斯兰民事日历
NSJapaneseCalendar 日本日历
*/
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSCalendar *calendar3 = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierJapanese];
NSLog(@"calendar3 = %@",calendar3.calendarIdentifier); // calendar3 = japanese
NSCalendar *calendar4 = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierChinese];
NSLog(@"calendar4 = %@",calendar4.calendarIdentifier); // calendar4 = chinese
/*2.2 - (void)setFirstWeekday:(NSUInteger)value;
设定每周的第一天从星期几开始,比如:
. 如需设定从星期日开始,则value传入1
. 如需设定从星期一开始,则value传入2
. 以此类推
详细信息请参阅FirstWeekday属性
*/
[calendar setFirstWeekday:2];
/*2.3 - (void)setLocale:(NSLocale *)locale; 设置区域*/
[calendar setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
/*2.4 - (void)setMinimumDaysInFirstWeek:(NSUInteger)mdw */
//设定作为(每年及每月)第一周必须包含的最少天数,比如:. 如需设定第一周最少包括7天,则value传入7
[calendar setMinimumDaysInFirstWeek:7];
/*2.5 - (void)setTimeZone:(NSTimeZone *)tz */
//设置时区
[calendar setTimeZone:[NSTimeZone defaultTimeZone]];
/**3. Getting Information About a Calendar*/
/*3.1 - (NSString *)calendarIdentifier 返回日历标示符 */
NSString *canlendarIdentifier = calendar.calendarIdentifier;
NSLog(@"canlendarIdentifier = %@",canlendarIdentifier); //canlendarIdentifier = gregorian
/*3.2 - (NSUInteger)firstWeekday 返回日历指定的每周的第一天从星期几开始。缺省为星期天,即firstWeekday = 1*/
NSUInteger firstWeekday = [calendar firstWeekday];
NSLog(@"firstWeekday = %d",firstWeekday); // firstWeekday = 2
/*3.3 - (NSLocale *)locale 返回日历指定的地区信息*/
NSLocale *locale = [calendar locale];
NSLog(@"localeIdentifier = %@",locale.localeIdentifier); // localeIdentifier = en_US
/*3.4
//- (NSRange)maximumRangeOfUnit:(NSCalendarUnit)unit //返回单元的最大范围
//- (NSRange)minimumRangeOfUnit:(NSCalendarUnit)unit //返回单元的最小范围
//比如Day Calendar Unit就是一个月最多31天这个意思
Calendar Units
Specify calendrical units such as day and month.
enum {
NSEraCalendarUnit = kCFCalendarUnitEra,
NSYearCalendarUnit = kCFCalendarUnitYear,
NSMonthCalendarUnit = kCFCalendarUnitMonth,
NSDayCalendarUnit = kCFCalendarUnitDay,
NSHourCalendarUnit = kCFCalendarUnitHour,
NSMinuteCalendarUnit = kCFCalendarUnitMinute,
NSSecondCalendarUnit = kCFCalendarUnitSecond,
NSWeekCalendarUnit = kCFCalendarUnitWeek,
NSWeekdayCalendarUnit = kCFCalendarUnitWeekday,
NSWeekdayOrdinalCalendarUnit = kCFCalendarUnitWeekdayOrdinal,
NSQuarterCalendarUnit = kCFCalendarUnitQuarter,
NSWeekOfMonthCalendarUnit = kCFCalendarUnitWeekOfMonth,
NSWeekOfYearCalendarUnit = kCFCalendarUnitWeekOfYear,
NSYearForWeekOfYearCalendarUnit = kCFCalendarUnitYearForWeekOfYear
NSCalendarCalendarUnit = (1 << 20),
NSTimeZoneCalendarUnit = (1 << 21),
};
typedef NSUInteger NSCalendarUnit;
*/
// 月Day的最大范围
NSRange maxRangeDay = [calendar maximumRangeOfUnit:NSCalendarUnitDay];
NSLog(@"maxRangeDay = %@",NSStringFromRange(maxRangeDay)); // maxRangeDay = {1, 31}
// 月Day的最小范围
NSRange minRangeDay = [calendar minimumRangeOfUnit:NSCalendarUnitDay];
NSLog(@"minRangeDay = %@",NSStringFromRange(minRangeDay)); // minRangeDay = {1, 28}
// 每年的月的最大范围
NSRange maxRangeMonth = [calendar maximumRangeOfUnit:NSCalendarUnitMonth];
NSLog(@"maxRangeMonth = %@",NSStringFromRange(maxRangeMonth)); // maxRangeMonth = {1, 12}
// 每个月周的最小范围
NSRange minRangeWeekOfMonth = [calendar minimumRangeOfUnit:NSCalendarUnitWeekOfMonth];
NSLog(@"minRangeWeekOfMonth = %@",NSStringFromRange(minRangeWeekOfMonth)); //minRangeWeekOfMonth = {1, 4}
/* 3.5 - (NSUInteger)minimumDaysInFirstWeek 返回日历指定的第一周必须包含的最少天数。*/
NSUInteger minimumDays = [calendar minimumDaysInFirstWeek];
NSLog(@"minimumDays = %d",minimumDays); // minimumDays = 7
/* 3.6 - (NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date*/
//在一个给定的时间,小日历单元如(一天)在大日历单元(一周)中的序数。
//比如forDate参数是星期一,而且firstWeekday 参数被设置为2(也就是星期一为一周的第一天),那么返回为1
//通过这个函数可以判断 例如 :给定的日期是在一周的第几天,或一月的第几周。一年的第几个月。一年的第几天等
//注:firstWeekday的设定会影响这个函数的返回值
int ordinality = [calendar ordinalityOfUnit:NSCalendarUnitWeekday inUnit:NSCalendarUnitMonth forDate:[NSDate date]];
NSLog(@"ordinality = %@",[NSString stringWithFormat:@"%d",ordinality ]); // ordinality = 1
/*3.7 - (NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date */
// 一个小日历单元下。大日历单元的范围 例如 小日历单元是天。大日历单元是周。那么范围就是7天。就是1-7
NSRange rangeUnit = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:[NSDate date]];
NSLog(@"rangeUnit = %@",NSStringFromRange(rangeUnit)); // rangeUnit = {1, 31}
/*3.8 - (BOOL)rangeOfUnit:(NSCalendarUnit)unit startDate:(NSDate **)datep interval:(NSTimeInterval *)tip forDate:(NSDate *)date
//用于返回日期date(参数)所在的那个日历单元unit(参数)的开始时间(sDate)。
//其中参数unit指定了日历单元,参数sDate用于返回日历单元的第一天,参数unitSecs用于返回日历单元的长度(以秒为单位),参数date指定了一个特定的日期。
//如果startDate和interval均为可计算的,那么函数返回YES否则返回NO.
*/
NSDate *dateOut = [NSDate date];
NSDateComponents *dc = [[NSDateComponents alloc] init];
dc.year = 2014;
dc.month = 10;
dc.day = 1;
NSDate *dateCalendar = [currentcalender dateFromComponents:dc];
NSTimeInterval startTime;
NSTimeInterval *startTimeInt = &startTime;
if ([calendar rangeOfUnit:NSCalendarUnitDay startDate:&dateOut interval:startTimeInt forDate:dateCalendar]) {
NSLog(@"%@",[dateOut description]); // 2014-09-30 16:00:00 +0000
NSLog(@"%f",*startTimeInt); // 86400.000000
}else
{
NSLog(@"Can not be calculated!");
}
//3.9 - (NSTimeZone *)timeZone
//返回日历指定的时区信息。
NSTimeZone *timeZone = [calendar timeZone];
NSLog(@"timeZone = %@",timeZone.abbreviation); // timeZone = GMT+8
/** 4 Calendrical Calculations 日历计算*/
//4.1 - (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)date
// NSDateComponents 返回时间组件
unsigned unitFlags = NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond;
NSDate *date = [NSDate date];
NSDateComponents *components = [calendar components:unitFlags fromDate:date];
int year = components.year;
int month = components.month;
int day = components.day;
int hour = components.hour;
int minute = components.minute;
int second = components.second;
NSLog(@"%d,%d,%d,%d,%d,%d",year,month,day,hour,minute,second); // 2014,12,7,17,51,32
//4.2 - (NSDateComponents *)components:(NSUInteger)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSUInteger)opts
//返回时间组件 比较2个日期的时间差值
NSDate *startDate = date;
NSDate *endDate = [[NSDate alloc] initWithTimeIntervalSinceNow:86400*2 ];
unsigned int unitFlags2 = NSCalendarUnitYear | NSCalendarUnitMonth |NSCalendarUnitDay;
NSDateComponents *comps2 = [calendar components:unitFlags2 fromDate:startDate toDate:endDate options:0];
int years = [comps2 year];
int months = [comps2 month];
int days = [comps2 day];
NSLog(@"years = %d ,months = %d days = %d",years,months,days); // years = 0 ,months = 0 days = 2
//输出: years = 0 ,months = 0 days = 2
// 4.3 - (NSDate *)dateByAddingComponents:(NSDateComponents *)comps toDate:(NSDate *)date options:(NSUInteger)opts
// 追加日期 并返回一个新日期
NSDate *currentDate = [NSDate date];
NSDateComponents *comps3 = [[NSDateComponents alloc] init];
[comps3 setMonth:2];
[comps3 setDay:3];
NSDate *newDate = [calendar dateByAddingComponents:comps3 toDate:currentDate options:0];
NSLog(@"newDate = %@",newDate); // newDate = 2015-02-10 09:51:32
// 4.4 - (NSDate *)dateFromComponents:(NSDateComponents *)comps
//创建日期
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setYear:2014];
[comps setMonth:10];
[comps setDay:1];
[comps setHour:12];
[comps setMinute:0];
[comps setSecond:0];
NSDate *createdate = [calendar dateFromComponents:comps];
NSLog(@"createdate = %@",createdate); // createdate = 2014-10-01 04:00:00 +0000