一、NSCalendar
NSCalendar可以很方便的用來表示日期,獲取日期的各種信息,包括年、月、日,時(shí)分秒??梢院芊奖愕挠?jì)算兩個(gè)日期之前的關(guān)系。也可以很方便的根據(jù)一個(gè)日期獲取另一個(gè)日期。
NSCalendar中有一個(gè)重要的概念NSCalendarUnit,這是一個(gè)位枚舉,意味著作為參數(shù)可以采用位運(yùn)算的方式傳參。
typedef NS_OPTIONS(NSUInteger, NSCalendarUnit) {
// 公元前、公元后
NSCalendarUnitEra = kCFCalendarUnitEra,
// 獲取年、月、日
NSCalendarUnitYear = kCFCalendarUnitYear,
NSCalendarUnitMonth = kCFCalendarUnitMonth,
NSCalendarUnitDay = kCFCalendarUnitDay,
// 獲取時(shí)、分、秒
NSCalendarUnitHour = kCFCalendarUnitHour,
NSCalendarUnitMinute = kCFCalendarUnitMinute,
NSCalendarUnitSecond = kCFCalendarUnitSecond,
// 獲取周幾 周日為1 、周1為2
NSCalendarUnitWeekday = kCFCalendarUnitWeekday,
// 獲取本周是本月的第幾周,7天為1個(gè)單位
NSCalendarUnitWeekdayOrdinal = kCFCalendarUnitWeekdayOrdinal,
// 獲取刻鐘,15分鐘為1刻鐘
NSCalendarUnitQuarter API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0)) = kCFCalendarUnitQuarter,
// 本月第幾周
NSCalendarUnitWeekOfMonth API_AVAILABLE(macos(10.7), ios(5.0), watchos(2.0), tvos(9.0)) = kCFCalendarUnitWeekOfMonth,
// 本年第幾周
NSCalendarUnitWeekOfYear API_AVAILABLE(macos(10.7), ios(5.0), watchos(2.0), tvos(9.0)) = kCFCalendarUnitWeekOfYear,
NSCalendarUnitYearForWeekOfYear API_AVAILABLE(macos(10.7), ios(5.0), watchos(2.0), tvos(9.0)) = kCFCalendarUnitYearForWeekOfYear,
// 納秒
NSCalendarUnitNanosecond API_AVAILABLE(macos(10.7), ios(5.0), watchos(2.0), tvos(9.0)) = (1 << 15),
NSCalendarUnitCalendar API_AVAILABLE(macos(10.7), ios(4.0), watchos(2.0), tvos(9.0)) = (1 << 20),
NSCalendarUnitTimeZone API_AVAILABLE(macos(10.7), ios(4.0), watchos(2.0), tvos(9.0)) = (1 << 21),
}
要使用NSCalendar,離不開NSDate。那么我們看看他們之間的常用用法
二、常用用法
NSCalendar 可以將指定的NSDate 轉(zhuǎn)化成 NSDateComponents,從而來獲取date在指定日歷中日期信息(年月日時(shí)分秒星期等等)
NSCalendar 也可以將指定的NSDateComponents 轉(zhuǎn)化成 NSDate
1 使用NSDateComponents獲取NSDate 年月日
另外一個(gè)比較重要的類是NSDateComponents,上面是通過位參數(shù)獲取每個(gè)單位(年月日)的信息,返回的結(jié)構(gòu)可以看到是一個(gè)NSDateComponents,如果我要表示一個(gè)日期的信息,構(gòu)建日期或者進(jìn)行日期的計(jì)算,就少不了NSDateComponents,它可以將日期按照單位的形式封裝起來,然后通過NSCalendar的方法進(jìn)行計(jì)算
NSDateComponents *comps = [NSCalendar.currentCalendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[NSDate date]];
比如判斷兩個(gè)日期是否同一年或者同一個(gè)月或者同一日
NSDate* lastDate = [NSDate dateWithTimeIntervalSince1970:lastTipTime];
unsigned int unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
NSDateComponents * lastComps = [[NSCalendar currentCalendar] components:unitFlags fromDate:lastDate];
NSDateComponents * today = [[NSCalendar currentCalendar] components:unitFlags fromDate:[NSDate date]];
if ([lastComps day] == [today day] && [lastComps month] == [today month])
{
return NO;
}
return YES;
2 判斷給定NSDate日期是否為今天、昨天、明天或者周末
isDateInToday
isDateInYesterday
isDateInTomorrow
isDateInWeekend