iOS开发中常用的对NSDate日期的处理

最近要开一个新的项目,就想着把之前项目中整理的内容拷贝过来,于是总结了一下项目常用的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

  

猜你喜欢

转载自www.cnblogs.com/LSArlen/p/9877933.html
今日推荐