一、NSCalendar
NSCalendar可以很方便的用来表示日期,获取日期的各种信息,包括年、月、日,时分秒。可以很方便的计算两个日期之前的关系。也可以很方便的根据一个日期获取另一个日期。
NSCalendar中有一个重要的概念NSCalendarUnit,这是一个位枚举,意味着作为参数可以采用位运算的方式传参。
typedef NS_OPTIONS(NSUInteger, NSCalendarUnit) {
// 公元前、公元后
NSCalendarUnitEra = kCFCalendarUnitEra,
// 获取年、月、日
NSCalendarUnitYear = kCFCalendarUnitYear,
NSCalendarUnitMonth = kCFCalendarUnitMonth,
NSCalendarUnitDay = kCFCalendarUnitDay,
// 获取时、分、秒
NSCalendarUnitHour = kCFCalendarUnitHour,
NSCalendarUnitMinute = kCFCalendarUnitMinute,
NSCalendarUnitSecond = kCFCalendarUnitSecond,
// 获取周几 周日为1 、周1为2
NSCalendarUnitWeekday = kCFCalendarUnitWeekday,
// 获取本周是本月的第几周,7天为1个单位
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 转化成 NSDateComponents,从而来获取date在指定日历中日期信息(年月日时分秒星期等等)
NSCalendar 也可以将指定的NSDateComponents 转化成 NSDate
1 使用NSDateComponents获取NSDate 年月日
另外一个比较重要的类是NSDateComponents,上面是通过位参数获取每个单位(年月日)的信息,返回的结构可以看到是一个NSDateComponents,如果我要表示一个日期的信息,构建日期或者进行日期的计算,就少不了NSDateComponents,它可以将日期按照单位的形式封装起来,然后通过NSCalendar的方法进行计算
NSDateComponents *comps = [NSCalendar.currentCalendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[NSDate date]];
比如判断两个日期是否同一年或者同一个月或者同一日
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