最近要开一个新的项目,就想着把之前项目中整理的内容拷贝过来,于是总结了一下项目常用的NSDate的处理。代码的git地址:https://github.com/LSArlen/LSADate
.h文件
#import <Foundation/Foundation.h> #define LSD_MINUTE 60 #define LSD_HOUR 3600 #define LSD_DAY 86400 #define LSD_WEEK 604800 #define LSD_YEAR 31556926 //星期状态 typedef enum : NSUInteger { LSWeekStateSunday = 1, //星期日 LSWeekStateMonday, //星期一 LSWeekStateTuesday, //星期二 LSWeekStateWednesday, //星期三 LSWeekStateThursday, //星期四 LSWeekStateFriday, //星期五 LSWeekStateSaturday, //星期六 } LSWeekState; /***** 添加新的枚举值后,在 formatStringByType 中设置 *****/ typedef enum : NSUInteger { LSADateFormatterTypeDefault, //YYYY-MM-dd:hh-mm-ss LSADateFormatterTypeYYYY_MM_dd, //YYYY.MM.dd LSADateFormatterTypeYYYYMMDD, //YYYY-MM-dd } LSADateFormatterType; @interface NSDate (LSADate) #pragma mark - 日期进行解析 /***** 年 *****/ - (NSInteger)year; /***** 月 *****/ - (NSInteger)month; /***** 日 *****/ - (NSInteger)day; /***** 时 *****/ - (NSInteger)hour; /***** 分钟 *****/ - (NSInteger)minutes; /***** 秒 *****/ - (NSInteger)second; #pragma mark - 对工作日的判定 /***** 是否是工作日 *****/ - (BOOL)isWeekDays; /***** 是否是休息日 *****/ - (BOOL)isWeekEnds; /***** 获取 week 信息 *****/ - (LSWeekState)weekState; /***** 获取周一至周日的描述 *****/ - (NSString *)weekZDescription; /***** 获取星期一至星期日 *****/ - (NSString *)weekXQDescription; #pragma mark - 对当前日期距离的描述 //该日期对象距离当前日期的描述:例如:10分钟前、1天前、4月3日、1年前 - (NSString *)timeIntervalDescriptionForCurrentDate; //以毫秒数显示距离标准时间的时间差 - (NSTimeInterval)timeIntervalSince1970InMilliSecond; #pragma mark - 日期比较:是否是。同年、同月、同日、同时、同分。 /***** 是否是今天 *****/ - (BOOL)isToday; /***** 是否是本周 *****/ - (BOOL)isCurrentWeek; /***** 是否是本月 *****/ - (BOOL)isCurrentMonth; /***** 是否是本年 *****/ - (BOOL)isCurrentYear; /***** 是否同年 *****/ - (BOOL)isSameYearWithDate:(NSDate *)date; /***** 是否同月 *****/ - (BOOL)isSameMonthWithDate:(NSDate *)date; /***** 是否同日 *****/ - (BOOL)isSameDayWithDate:(NSDate *)date; /***** 是否同周 *****/ - (BOOL)isSameWeekWithDate:(NSDate *)date; #pragma mark - 获取相对时间 /***** 零点时刻 *****/ - (NSDate *)zeroDate; /***** 昨天此刻 *****/ - (NSDate *)lastDate; /***** 明天此刻 *****/ - (NSDate *)nextDate; /***** 相隔一定天数的时刻 *****/ - (NSDate *)dateWtihDaysOffset:(NSInteger)offset; /***** 相隔一定小时的日期 *****/ - (NSDate *)dateWtihHoursOffset:(NSInteger)offset; /***** 相隔一定分钟的日期 *****/ - (NSDate *)dateWtihMinutesOffset:(NSInteger)offset; #pragma mark - 判断时间先后顺序 /***** 是否在 time1 和 time2 之间 *****/ - (BOOL)isBetweenTimeStamp:(NSTimeInterval)time1 timeStamp:(NSTimeInterval)time2; /***** 是否在毫秒 time1 和 毫秒time2 之间 *****/ - (BOOL)isBetweenMilliSecondTimeStamp:(NSTimeInterval)time1 timeStamp:(NSTimeInterval)time2; /***** 是否在 date1 和 date2 之间 *****/ - (BOOL)isBetweenDate:(NSDate *)date1 date2:(NSDate *)date2; /***** 是否早于 date *****/ - (BOOL)isEarlierThanDate:(NSDate *)date; /***** 是否晚于 date *****/ - (BOOL)isLaterThanDate:(NSDate *)date; /***** 是否早于 time *****/ - (BOOL)isEarlierThanTime:(NSTimeInterval)time; /***** 是否晚于 time *****/ - (BOOL)isLaterThanTime:(NSTimeInterval)time; /***** 是否早于 MilliSecond time *****/ - (BOOL)isEarlierThanMilliSecondTime:(NSTimeInterval)time; /***** 是否晚于 MilliSecond time *****/ - (BOOL)isLaterThanMilliSecondTime:(NSTimeInterval)time; #pragma mark - 日期、字符串相互转换 /** 把日期转换为字符串 @param format 转换的格式 @return 转换后得到的字符串 */ - (NSString *)dateStringWithFormat:(NSString *)format; @end @interface NSString (LSADate) /** 把字符串转换为日期 @param format 日期的格式 @return 转换后得到的日期 */ - (NSDate *)dateWithFormat:(NSString *)format; /** 获取常用的一些日期转换格式 @param fotmatterType 格式类型 @return 得到的日期格式字符串 */ + (NSString *)dateFormatWithType:(LSADateFormatterType)formatterTyp @end
.m文件
#import "NSDate+LSADate.h" @implementation NSDate (LSADate) #pragma mark - 获取当前日期的:年、月、日、时、分、秒 /***** 年 *****/ - (NSInteger)year { NSCalendar *calendar = [NSCalendar currentCalendar]; NSInteger unitFlags = NSCalendarUnitYear; NSDateComponents *comps = [calendar components:unitFlags fromDate:self]; return comps.year; } /***** 月 *****/ - (NSInteger)month { NSCalendar *calendar = [NSCalendar currentCalendar]; NSInteger unitFlags = NSCalendarUnitMonth; NSDateComponents *comps = [calendar components:unitFlags fromDate:self]; return comps.month; } /***** 日 *****/ - (NSInteger)day { NSCalendar *calendar = [NSCalendar currentCalendar]; NSInteger unitFlags = NSCalendarUnitDay; NSDateComponents *comps = [calendar components:unitFlags fromDate:self]; return comps.month; } /***** 小时 *****/ - (NSInteger)hour { NSCalendar *calendar = [NSCalendar currentCalendar]; NSInteger unitFlags = NSCalendarUnitHour; NSDateComponents *comps = [calendar components:unitFlags fromDate:self]; return comps.hour; } /***** 分 *****/ - (NSInteger)minutes { NSCalendar *calendar = [NSCalendar currentCalendar]; NSInteger unitFlags = NSCalendarUnitMinute; NSDateComponents *comps = [calendar components:unitFlags fromDate:self]; return comps.minute; } /***** 秒 *****/ - (NSInteger)second { NSCalendar *calendar = [NSCalendar currentCalendar]; NSInteger unitFlags = NSCalendarUnitSecond; NSDateComponents *comps = [calendar components:unitFlags fromDate:self]; return comps.second; } #pragma mark - 获取当前日期所属的 week 信息 //是否是工作日 - (BOOL)isWeekDays { BOOL weekEnds = [self isWeekEnds]; return !weekEnds; } //是否是休息日 - (BOOL)isWeekEnds { LSWeekState state = [self weekState]; if (state == LSWeekStateSunday || state == LSWeekStateSaturday) { return YES; } return NO; } /***** 周 *****/ - (LSWeekState)weekState { NSCalendar *calendar = [NSCalendar currentCalendar]; NSInteger unitFlags = NSCalendarUnitWeekOfMonth|NSCalendarUnitWeekday; NSDateComponents *comps = [calendar components:unitFlags fromDate:self]; return comps.weekday; } /***** 对周的描述 *****/ - (NSString *)weekZDescription { switch (self.weekState) { case LSWeekStateSunday: return @"周日"; break; case LSWeekStateMonday: return @"周一"; break; case LSWeekStateTuesday: return @"周二"; break; case LSWeekStateWednesday: return @"周三"; break; case LSWeekStateThursday: return @"周四"; break; case LSWeekStateFriday: return @"周五"; break; case LSWeekStateSaturday: return @"周六"; break; default: break; } return nil; } /***** 对星期的描述 *****/ - (NSString *)weekXQDescription { switch (self.weekState) { case LSWeekStateSunday: return @"星期日"; break; case LSWeekStateMonday: return @"星期一"; break; case LSWeekStateTuesday: return @"星期二"; break; case LSWeekStateWednesday: return @"星期三"; break; case LSWeekStateThursday: return @"星期四"; break; case LSWeekStateFriday: return @"星期五"; break; case LSWeekStateSaturday: return @"星期六"; break; default: break; } return nil; } #pragma mark - 获取该日期对象距离当前日期的时间间隔描述 //该日期对象距离当前日期的描述:例如:10分钟前、1天前、4月3日、1年前 - (NSString *)timeIntervalDescriptionForCurrentDate { NSTimeInterval timeInterval = -[self timeIntervalSinceNow]; if (timeInterval < 60) { return @"1分钟内"; } else if (timeInterval < 3600) { return [NSString stringWithFormat:@"%ld分钟前", (long)timeInterval / LSD_MINUTE]; } else if (timeInterval < 86400) { return [NSString stringWithFormat:@"%ld小时前", (long)timeInterval / LSD_HOUR]; } else if (timeInterval < 2592000) {//30天内 return [NSString stringWithFormat:@"%ld天前", (long)timeInterval / LSD_DAY]; } else if (timeInterval < 31536000) {//30天至1年内 return [self dateStringWithFormat:@"M月d日"]; } else { return [NSString stringWithFormat:@"%ld年前", (long)timeInterval / LSD_YEAR]; } } //以毫秒数显示距离标准时间的时间差 - (NSTimeInterval)timeIntervalSince1970InMilliSecond; { return [self timeIntervalSince1970] * 1000; } #pragma mark - 日期比较:是否是。同年、同月、同日、同时、同分。 /***** 是否是今天 *****/ - (BOOL)isToday { return [self isSameDayWithDate:[NSDate date]]; } /***** 是否是本周 *****/ - (BOOL)isCurrentWeek { return [self isSameWeekWithDate:[NSDate date]]; } /***** 是否是本月 *****/ - (BOOL)isCurrentMonth { return [self isSameMonthWithDate:[NSDate date]]; } /***** 是否是本年 *****/ - (BOOL)isCurrentYear { return [self isSameYearWithDate:[NSDate date]]; } /***** 是否同年 *****/ - (BOOL)isSameYearWithDate:(NSDate *)date { NSUInteger unitFlags = NSCalendarUnitYear; NSDateComponents *com1 = [[NSCalendar currentCalendar] components:unitFlags fromDate:self]; NSDateComponents *com2 = [[NSCalendar currentCalendar] components:unitFlags fromDate:date]; if (com1.year == com2.year) { return YES; } return NO; } /***** 是否同月 *****/ - (BOOL)isSameMonthWithDate:(NSDate *)date { NSUInteger unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth; NSDateComponents *com1 = [[NSCalendar currentCalendar] components:unitFlags fromDate:self]; NSDateComponents *com2 = [[NSCalendar currentCalendar] components:unitFlags fromDate:date]; if (com1.year == com2.year && com1.month == com2.month) { return YES; } return NO; } /***** 是否同周 *****/ - (BOOL)isSameWeekWithDate:(NSDate *)date { NSUInteger unitFlags = NSCalendarUnitYear | NSCalendarUnitWeekOfYear; NSDateComponents *com1 = [[NSCalendar currentCalendar] components:unitFlags fromDate:self]; NSDateComponents *com2 = [[NSCalendar currentCalendar] components:unitFlags fromDate:date]; if (com1.year == com2.year && com1.weekOfYear == com2.weekOfYear) { return YES; } return NO; } /***** 是否同日 *****/ - (BOOL)isSameDayWithDate:(NSDate *)date { NSUInteger unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; NSDateComponents *com1 = [[NSCalendar currentCalendar] components:unitFlags fromDate:self]; NSDateComponents *com2 = [[NSCalendar currentCalendar] components:unitFlags fromDate:date]; if (com1.year == com2.year && com1.month == com2.month && com1.day == com2.day) { return YES; } return NO; } #pragma mark - 判断相对时间 /***** 零点时刻 *****/ - (NSDate *)zeroDate { NSCalendar *calendar = [NSCalendar currentCalendar]; NSUInteger unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; NSDateComponents *components = [calendar components:unitFlags fromDate:self]; NSDate *date = [calendar dateFromComponents:components]; return date; } /***** 昨天此刻 *****/ - (NSDate *)lastDate { return [self dateWtihDaysOffset:-1]; } /***** 明天此刻 *****/ - (NSDate *)nextDate { return [self dateWtihDaysOffset:1]; } /***** 相隔一定天数的时刻 *****/ - (NSDate *)dateWtihDaysOffset:(NSInteger)offset { return [NSDate dateWithTimeInterval:LSD_DAY * offset sinceDate:self]; } /***** 相隔一定小时的日期 *****/ - (NSDate *)dateWtihHoursOffset:(NSInteger)offset { return [NSDate dateWithTimeInterval:LSD_HOUR * offset sinceDate:self]; } /***** 相隔一定分钟的日期 *****/ - (NSDate *)dateWtihMinutesOffset:(NSInteger)offset { return [NSDate dateWithTimeInterval:LSD_MINUTE * offset sinceDate:self]; } #pragma mark - 判断时间先后顺序 /***** 是否在 time1 和 time2 之间 *****/ - (BOOL)isBetweenTimeStamp:(NSTimeInterval)time1 timeStamp:(NSTimeInterval)time2; { BOOL isBetween = [self isBetweenMilliSecondTimeStamp:time1*1000 timeStamp:time2*1000]; return isBetween; } /***** 是否在毫秒 time1 和 毫秒time2 之间 *****/ - (BOOL)isBetweenMilliSecondTimeStamp:(NSTimeInterval)time1 timeStamp:(NSTimeInterval)time2 { NSTimeInterval time0 = [self timeIntervalSince1970InMilliSecond]; if (time1 < time2) { if (time1 < time0 && time0 < time2) { return YES; } else { return NO; } } else { if (time2 < time0 && time0 < time1) { return YES; } return NO; } return NO; } /***** 是否在 date1 和 date2 之间 *****/ - (BOOL)isBetweenDate:(NSDate *)date1 date2:(NSDate *)date2 { NSTimeInterval time1 = [date1 timeIntervalSince1970]; NSTimeInterval time2 = [date2 timeIntervalSince1970]; return [self isBetweenTimeStamp:time1 timeStamp:time2]; } /***** 是否早于 date *****/ - (BOOL)isEarlierThanDate:(NSDate *)date { return [self isEarlierThanTime:[date timeIntervalSince1970]]; } /***** 是否晚于 date *****/ - (BOOL)isLaterThanDate:(NSDate *)date { return [self isLaterThanTime:[date timeIntervalSince1970]]; } /***** 是否早于 time *****/ - (BOOL)isEarlierThanTime:(NSTimeInterval)time { return [self isEarlierThanMilliSecondTime:time*1000]; } /***** 是否晚于 time *****/ - (BOOL)isLaterThanTime:(NSTimeInterval)time { return [self isLaterThanMilliSecondTime:time*1000]; } /***** 是否早于 MilliSecond time *****/ - (BOOL)isEarlierThanMilliSecondTime:(NSTimeInterval)time { NSTimeInterval time0 = [self timeIntervalSince1970InMilliSecond]; if (time0 < time) { return YES; } return NO; } /***** 是否晚于 MilliSecond time *****/ - (BOOL)isLaterThanMilliSecondTime:(NSTimeInterval)time { NSTimeInterval time0 = [self timeIntervalSince1970InMilliSecond]; if (time0 > time) { return YES; } return NO; } #pragma mark - 日期、字符串相互转换 /***** 根据指定的格式转换为对应的日期字符串 *****/ - (NSString *)dateStringWithFormat:(NSString *)format { NSDateFormatter *df = [[NSDateFormatter alloc] init]; df.dateFormat = format; NSString *dateString = [df stringFromDate:self]; return dateString; } @end @implementation NSString (LSADate) /***** 指定的字符串转换为日期 *****/ - (NSDate *)dateWithFormat:(NSString *)format { NSDateFormatter *df = [[NSDateFormatter alloc] init]; df.dateFormat = format; NSDate *date = [df dateFromString:self]; return date; } /** 获取常用的一些日期转换格式 @param fotmatterType 格式类型 @return 得到的日期格式字符串 */ + (NSString *)dateFormatWithType:(LSADateFormatterType)formatterTyp { if (formatterTyp == LSADateFormatterTypeYYYY_MM_dd) { return @"YYYY.MM.dd"; } else if (formatterTyp == LSADateFormatterTypeYYYYMMDD) { return @"YYYY-MM-dd"; } else{ return @"YYYY-MM-dd:hh-mm-ss"; } } @end