IOS基础:常用的Foundation分类方法
2020-11-03 本文已影响0人
时光啊混蛋_97boy
原创:知识点总结性文章
创作不易,请珍惜,之后会持续更新,不断完善
个人比较喜欢做笔记和写总结,毕竟好记性不如烂笔头哈哈,这些文章记录了我的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