美文网首页
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分类方法

    原创:知识点总结性文章创作不易,请珍惜,之后会持续更新,不断完善个人比较喜欢做笔记和写总结,毕竟好记性不如烂笔头哈...

  • Foundation框架学习

    Foundation框架是其他所有iOS框架的基础,Foundation框架中包含了很多开发中常用的数据类型 结构...

  • iOS NSException与crash处理

    利用 分类(category) + runtime + 异常的捕获 来防止Foundation一些常用方法使用不当...

  • IOS基础:常用的UIKit分类方法

    原创:知识点总结性文章创作不易,请珍惜,之后会持续更新,不断完善个人比较喜欢做笔记和写总结,毕竟好记性不如烂笔头哈...

  • iOS 基础04--Foundation框架下基本集合类

    iOS 基础04--Foundation框架下基本集合类 不可变集合的最大好处是线程安全。 1、常用基本集合类: ...

  • Foundation框架之字符串

    Foundation框架 简介 Foundation框架是Cocoa编程、iOS编程的基础框架,它包括字符串、集合...

  • OC-Foundation

    Foundation 框架是其他所有iOS框架的基础 包含了很多开发中常用的数据类型结构体枚举类 要想使用Foun...

  • iOS常用分类方法

    在工作中总结了一些开发中常用到的分类,使用这些分类能使开发效率更高,让代码变得更简洁,减少了很多不必要的代码量,直...

  • IOS开发(三)高级控件

    IOS基础控件思维导图 三、高级控件 1、UITabBarController (1)常用属性 (2)常用方法 (...

  • OC学习(1)-字符串

    字符串 NSString类属于Foundation框架中字符串操作类Foundation框架是iOS开发编程的基础...

网友评论

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

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