美文网首页
IOS基础:常用的Foundation分类方法

IOS基础:常用的Foundation分类方法

作者: 时光啊混蛋_97boy | 来源:发表于2020-11-03 17:10 被阅读0次

    原创:知识点总结性文章
    创作不易,请珍惜,之后会持续更新,不断完善
    个人比较喜欢做笔记和写总结,毕竟好记性不如烂笔头哈哈,这些文章记录了我的IOS成长历程,希望能与大家一起进步
    温馨提示:由于简书不支持目录跳转,大家可通过command + F 输入目录标题后迅速寻找到你所需要的内容

    目录

    • 一、NSDate
      • 获取当前的时间
      • 获取星期几
      • 获取时间戳
      • 时间字符串
      • 获取某个月的天数
      • 比较日期
      • 计算日期
    • 二、NSObject
      • AssociatedObject
    • 三、NSNumber
      • 金额浮点数高精度运算
    • Pod库
    • Demo
    • 参考文献

    一、NSDate

    获取当前的时间

    a、运行效果
    2020-11-03 17:19:56.771598+0800 CategoryNSDemo[3514:4320468] 2020年,11月,3日,17时,19分,56秒,weekday为3
    
    b、功能代码
    - (NSCalendar *)calendar
    {
        return [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
    }
    
    - (NSInteger)year
    {
        return [[[self calendar] components:NSCalendarUnitYear fromDate:self] year];
    }
    
    - (NSInteger)month
    {
        return [[[self calendar] components:NSCalendarUnitMonth fromDate:self] month];
    }
    
    - (NSInteger)day
    {
        return [[[self calendar] components:NSCalendarUnitDay fromDate:self] day];
    }
    
    - (NSInteger)hour
    {
        return [[[self calendar] components:NSCalendarUnitHour fromDate:self] hour];
    }
    
    - (NSInteger)minute
    {
        return [[[self calendar] components:NSCalendarUnitMinute fromDate:self] minute];
    }
    
    - (NSInteger)second
    {
        return [[[self calendar] components:NSCalendarUnitSecond fromDate:self] second];
    }
    
    - (NSInteger)weekday
    {
        return [[[self calendar] components:NSCalendarUnitWeekday fromDate:self] weekday];
    }
    
    c、调用方式
    - (void)getCurrentTime
    {
        NSDate *date = [NSDate date];
        NSLog(@"%ld年,%ld月,%ld日,%ld时,%ld分,%ld秒,周%ld",(long)date.year,date.month,date.day,date.hour,date.minute,date.second,date.weekday);
    }
    

    获取星期几

    a、运行效果
    2020-11-03 17:30:10.725025+0800 CategoryNSDemo[3704:4330330] 星期二,周二,Tuesday
    
    b、功能代码
    - (NSString *)dayFromWeekday
    {
        return [NSDate dayFromWeekday:self];
    }
    
    - (NSString *)dayFromWeekday2
    {
        return [NSDate dayFromWeekday2:self];
    }
    
    - (NSString *)dayFromWeekday3
    {
        return [NSDate dayFromWeekday3:self];
    }
    
    + (NSString *)dayFromWeekday:(NSDate *)date
    {
        switch([date weekday])
        {
            case 1:
                return @"星期天";
                break;
            case 2:
                return @"星期一";
                break;
            case 3:
                return @"星期二";
                break;
            case 4:
                return @"星期三";
                break;
            case 5:
                return @"星期四";
                break;
            case 6:
                return @"星期五";
                break;
            case 7:
                return @"星期六";
                break;
            default:
                break;
        }
        return @"";
    }
    
    c、调用方式
    - (void)getWeekday
    {
        NSDate *date = [NSDate date];
        NSLog(@"%@,%@,%@",[date dayFromWeekday],[date dayFromWeekday2],[date dayFromWeekday3]);
    }
    

    获取时间戳

    a、运行效果
    2020-11-03 18:07:06.473829+0800 CategoryNSDemo[4306:4359508] 获取当前时间戳字符串:1604398026
    2020-11-03 18:07:06.474130+0800 CategoryNSDemo[4306:4359508] 获取当前系统时间的时间戳 [北京时间]:1604398026
    2020-11-03 18:07:06.474209+0800 CategoryNSDemo[4306:4359508] 将date转换成时间戳 (NSDate => Timestamp):1604398026
    2020-11-03 18:07:06.474953+0800 CategoryNSDemo[4306:4359508] 将时间戳转换成date (Timestamp => NSDate):2020-11-03 09:38:55 +0000
    2020-11-03 18:07:06.476334+0800 CategoryNSDemo[4306:4359508] 将时间字符串转换成时间戳 (TimeString => Timestamp) [北京时间]:1605425940
    2020-11-03 18:07:06.476510+0800 CategoryNSDemo[4306:4359508] 将时间戳转换成时间字符串 (Timestamp => TimeString) [北京时间]:2020-11-03 17:38
    
    b、功能代码

    获取当前时间戳字符串

    + (NSString *)currentTimeInterval
    {
        NSDate *date = [NSDate date];
        NSTimeInterval timeInterval = [date timeIntervalSince1970];
        NSString *timeIntervalString = [NSString stringWithFormat:@"%d", (int)timeInterval];
        return timeIntervalString;
    }
    

    获取当前系统时间的时间戳 [北京时间]

    + (NSInteger)getNowTimestampWithFormatter:(NSString *)format
    {
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateStyle:NSDateFormatterMediumStyle];
        [formatter setTimeStyle:NSDateFormatterShortStyle];
        [formatter setDateFormat:format];
        
        NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"Asia/Beijing"];
        [formatter setTimeZone:timeZone];
        
        return [self timestampFromDate:[NSDate date]];
    }
    

    将date转换成时间戳 (NSDate => Timestamp)

    + (NSInteger)timestampFromDate:(NSDate *)date
    {
        return [[NSNumber numberWithDouble:[date timeIntervalSince1970]] integerValue];
    }
    

    将时间戳转换成date (Timestamp => NSDate)

    + (NSDate *)dateFromTimestamp:(NSInteger)timestamp
    {
        return [NSDate dateWithTimeIntervalSince1970:timestamp];
    }
    

    将时间字符串转换成时间戳 (TimeString => Timestamp) [北京时间]

    + (NSInteger)timestampFromTimeString:(NSString *)timeString formatter:(NSString *)format
    {
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateStyle:NSDateFormatterMediumStyle];
        [formatter setTimeStyle:NSDateFormatterShortStyle];
        [formatter setDateFormat:format];
        
        NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"Asia/Beijing"];
        [formatter setTimeZone:timeZone];
        
        // 将字符串按formatter转成NSDate
        NSDate *date = [formatter dateFromString:timeString];
        return [self timestampFromDate:date];
    }
    

    将时间戳转换成时间字符串 (Timestamp => TimeString) [北京时间]

    + (NSString *)timeStringFromTimestamp:(NSInteger)timestamp formatter:(NSString *)format
    {
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateStyle:NSDateFormatterMediumStyle];
        [formatter setTimeStyle:NSDateFormatterShortStyle];
        [formatter setDateFormat:format];
        
        NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"Asia/Beijing"];
        [formatter setTimeZone:timeZone];
        
        NSDate *timeDate = [self dateFromTimestamp:timestamp];
        return [formatter stringFromDate:timeDate];
    }
    
    c、调用方式
    - (void)getTimeInterval
    {
        NSLog(@"获取当前时间戳字符串:%@",[NSDate currentTimeInterval]);
        NSLog(@"获取当前系统时间的时间戳 [北京时间]:%ld",(long)[NSDate getNowTimestampWithFormatter:@"yyyy-MM-dd HH:mm"]);
        NSLog(@"将date转换成时间戳 (NSDate => Timestamp):%ld",(long)[NSDate timestampFromDate:[NSDate date]]);
        NSLog(@"将时间戳转换成date (Timestamp => NSDate):%@",[NSDate dateFromTimestamp:1604396335]);
        NSLog(@"将时间字符串转换成时间戳 (TimeString => Timestamp) [北京时间]:%ld",(long)[NSDate timestampFromTimeString:@"2020-11-15 15:39" formatter:@"yyyy-MM-dd HH:mm"]);
        NSLog(@"将时间戳转换成时间字符串 (Timestamp => TimeString) [北京时间]:%@",[NSDate timeStringFromTimestamp:1604396335 formatter:@"yyyy-MM-dd HH:mm"]);
    }
    

    时间字符串

    a、运行效果
    2020-11-03 18:20:22.327078+0800 CategoryNSDemo[4498:4368943] 将date转换成时间字符串 (NSDate => TimeString):2020/11/03
    2020-11-03 18:20:22.328636+0800 CategoryNSDemo[4498:4368943] 将时间字符串转换成date (TimeString ==> NSDate):2020-11-14 16:00:00 +0000
    
    b、功能代码

    date转换成时间字符串 (NSDate => TimeString)

    + (NSString *)stringWithDate:(NSDate *)date format:(NSString *)format
    {
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:format];
        [formatter setLocale:[NSLocale currentLocale]];
        NSString *dateString = [formatter stringFromDate:date];
        return dateString;
    }
    

    将时间字符串转换成date (TimeString ==> NSDate)

    + (NSDate *)dateWithString:(NSString *)dateString format:(NSString *)format
    {
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:format];
        return [formatter dateFromString:dateString];
    }
    
    c、调用方式
    - (void)getTimeString
    {
        NSLog(@"将date转换成时间字符串 (NSDate => TimeString):%@",[NSDate stringWithDate:[NSDate date] format:@"yyyy/MM/dd"]);
        NSLog(@"将时间字符串转换成date (TimeString ==> NSDate):%@",[NSDate dateWithString:@"2020-11-15" format:@"yyyy/MM/dd"]);
    }
    

    获取某个月的天数

    a、运行效果
    2020-11-03 18:27:05.649597+0800 CategoryNSDemo[4622:4374377] 获取2020年11月的天数:30
    
    b、功能代码
    + (NSInteger)getSumOfDaysMonth:(NSInteger)month inYear:(NSInteger)year
    {
        NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"yyyy-MM"];
        NSString *dateString = [NSString stringWithFormat:@"%lu-%lu", year, month];
        NSDate *date = [formatter dateFromString:dateString];
        
        NSRange range = [[NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian] rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date];
        return range.length;
    }
    
    c、调用方式
    - (void)getMonthDays
    {
        NSLog(@"获取2020年11月的天数:%ld",(long)[NSDate getSumOfDaysMonth:11 inYear:2020]);
    }
    

    获取当前的"年月日时分"

    a、运行效果
    2020-11-03 18:29:51.024183+0800 CategoryNSDemo[4669:4377704] 获取当前的年月日时分:(
        2020,
        11,
        03,
        18,
        29
    )
    
    b、功能代码
    + (NSArray<NSString *> *)getCurrentTimeComponents
    {
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"yyyy-MM-dd-HH-mm"];
        NSDate *date = [NSDate date];
        NSString *time = [formatter stringFromDate:date];
        return [time componentsSeparatedByString:@"-"];
    }
    
    c、调用方式
    - (void)getTimeComponents
    {
        NSLog(@"获取当前的年月日时分:%@",[NSDate getCurrentTimeComponents]);
    }
    

    比较日期

    a、运行效果
    2020-11-04 09:46:58.114920+0800 CategoryNSDemo[6325:4445550] 比较的结果为:-1
    2020-11-04 09:46:58.115157+0800 CategoryNSDemo[6325:4445550] 2020-11-15日大于当前时间,属于未来
    
    b、功能代码

    比较两个date的大小关系

    + (NSComparisonResult)compareDateString1:(NSString *)dateString1
                                 dateString2:(NSString *)dateString2
                                   formatter:(NSString *)format
    {
        NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
        [formatter setDateFormat:format];
        
        NSDate *date1 = [[NSDate alloc] init];
        NSDate *date2 = [[NSDate alloc] init];
        
        date1 = [formatter dateFromString:dateString1];
        date2 = [formatter dateFromString:dateString2];
        
        return [date1 compare:date2];
    }
    

    是否小于当前时间(过去时间)

    - (BOOL)isInPast
    {
        return ([self compare:[NSDate date]] == NSOrderedAscending);
    }
    

    是否大于当前时间(未来时间)

    - (BOOL)isInFuture
    {
        return ([self compare:[NSDate date]] == NSOrderedDescending);
    }
    

    是否是今天

    - (BOOL)isToday
    {
        return [self isSameDay:[NSDate date]];
    }
    

    是否是同一天

    - (BOOL)isSameDay:(NSDate *)anotherDate
    {
        NSCalendar *calendar = [NSCalendar currentCalendar];
        NSDateComponents *components1 = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:self];
        NSDateComponents *components2 = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:anotherDate];
        
        return ([components1 year] == [components2 year] && [components1 month] == [components2 month] && [components1 day] == [components2 day]);
    }
    
    c、调用方式
    - (void)compareDay
    {
        NSComparisonResult result = [NSDate compareDateString1:@"2020-11-15" dateString2:@"2020-11-17" formatter:@"yyyy-MM-dd"];
        NSLog(@"比较的结果为:%ld",(long)result);
        
        NSDate *date = [NSDate dateWithString:@"2020-11-15" format:@"yyyy-MM-dd"];
        if ([date isInPast])
        {
            NSLog(@"2020-11-15日小于当前时间,属于过去");
        }
        
        if ([date isInFuture])
        {
            NSLog(@"2020-11-15日大于当前时间,属于未来");
        }
        
        if ([date isToday])
        {
            NSLog(@"2020-11-15日就在今天");
        }
    }
    

    计算日期

    a、运行效果
    2020-11-04 10:00:15.274302+0800 CategoryNSDemo[6532:4455232] 获取2天后的时间: 2020-11-06 02:00:15 +0000
    2020-11-04 10:00:15.274430+0800 CategoryNSDemo[6532:4455232] 获取5天前的时间: 2020-10-30 02:00:15 +0000
    
    b、功能代码

    获取之前的日期时间

    + (NSDate *)backward:(NSInteger)backward unitType:(NSCalendarUnit)unit
    {
        NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
        [dateComponents setValue:backward forComponent:unit];
        
        NSCalendar *calendar = [[self alloc] calendar];
        NSDate *dateFromDateComponents =  [calendar dateByAddingComponents:dateComponents toDate:[NSDate date] options:0];
        return dateFromDateComponents;
    }
    

    获取未来的日期时间

    + (NSDate *)forward:(NSInteger)forward unitType:(NSCalendarUnit)unit
    {
        return [self backward:-forward unitType:unit];
    }
    
    c、调用方式
    - (void)calculateDay
    {
        NSLog(@"获取2天后的时间: %@",[NSDate backward:2 unitType:NSCalendarUnitDay]);
        NSLog(@"获取5天前的时间: %@",[NSDate forward:5 unitType:NSCalendarUnitDay]);
    }
    

    二、NSObject

    AssociatedObject

    a、运行效果
    2020-11-04 10:25:56.441234+0800 CategoryNSDemo[7132:4474099] 被关联的值为: 97Boy
    
    b、功能代码
    - (id)getAssociatedValueForKey:(void *)key
    {
        return objc_getAssociatedObject(self, key);
    }
    
    - (void)setAssociatedValue:(id)value withKey:(void *)key
    {
        objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (void)removeAssociatedObjects
    {
        objc_removeAssociatedObjects(self);
    }
    
    // ASSIGN
    - (void)setAssignValue:(id)value withKey:(SEL)key
    {
        objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_ASSIGN);
    }
    
    // COPY
    - (void)setCopyValue:(id)value withKey:(SEL)key
    {
        objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_COPY_NONATOMIC);
    }
    
    c、调用方式
    - (void)associatedObject
    {
        NSArray *object = [[NSArray alloc] initWithObjects:@"Xie", @"Jia",@"Pei",nil];
        NSString *value = [[NSString alloc] initWithFormat:@"%@",@"97Boy"];
        
        [object setAssociatedValue:value withKey:&valueKey];
        
        NSString *associatedValue = (NSString *)[object getAssociatedValueForKey:&valueKey];
        NSLog(@"被关联的值为: %@", associatedValue);
    }
    

    三、NSNumber

    金额浮点数高精度运算

    a、运行效果
    2020-11-25 18:26:25.587596+0800 CategoryNSDemo[82059:5281646] 金额浮点数高精度减法运算,默认两位小数处理:4.030000
    2020-11-25 18:26:25.587701+0800 CategoryNSDemo[82059:5281646] 金额浮点数高精度比较,默认两位小数处理
    
    b、功能代码

    金额浮点数高精度减法运算,默认两位小数处理

    - (double)minusDecimalNumber:(NSNumber *)subtrahendNum
    {
        NSDecimalNumber *minuend = [self decimalNumber:self];
        NSDecimalNumber *subtrahend = [self decimalNumber:subtrahendNum];
        NSDecimalNumberHandler *handler = [[NSDecimalNumberHandler alloc] initWithRoundingMode:(NSRoundPlain) scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];
        NSDecimalNumber *res = [minuend decimalNumberBySubtracting:subtrahend withBehavior:handler];
        return res.doubleValue;
    }
    

    金额浮点数高精度比较,默认两位小数处理

    - (NSComparisonResult)compareDecimalNumber:(NSNumber *)num
    {
        NSDecimalNumber *first = [self decimalNumber:self];
        NSDecimalNumber *last = [self decimalNumber:num];
        return [first compare:last];
    }
    

    NSNumber转化为NSDecimalNumber

    - (NSDecimalNumber *)decimalNumber:(NSNumber *)num
    {
        NSDecimalNumber *decimalNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%.2f",num.doubleValue]];
        return decimalNumber;
    }
    
    c、调用方式
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        NSNumber *firstNumber = @(7.1243545);
        NSNumber *secondNumber = @(3.093543325665);
        double result = [firstNumber minusDecimalNumber:secondNumber];
        NSLog(@"金额浮点数高精度减法运算,默认两位小数处理:%f",result);
        
        if ([firstNumber compareDecimalNumber:secondNumber])
        {
            NSLog(@"金额浮点数高精度比较,默认两位小数处理");
        }
    }
    

    Pod库

    XJPCategoryKit可通过CocoaPods获得。要安装它,只需在Podfile中添加以下行:

    pod 'XJPCategoryKit'
    

    Demo

    Demo在我的Github上,欢迎下载。
    FunctionCodeBlock

    参考文献

    相关文章

      网友评论

          本文标题:IOS基础:常用的Foundation分类方法

          本文链接:https://www.haomeiwen.com/subject/chkivktx.html