引言

iOS获取时间的应用场景: 报表的时间筛选

iOS小技能: 时间处理(案例:构造退款单号、获取最近30天的数据)_iOS

I 获取月份

1.1 获取上个月

  • 用法
self.viewModel.multipleSwitchCellTableViewCellModel.MonthlyDateStr = [QCT_Common strdate4lastMonthlyStrYYMM];
  • strdate4lastMonthlyStrYYMM
/**
获取上个月份字符串
*/
+ (NSString *)strdate4lastMonthlyStrYYMM{




NSDate *currentDate = [NSDate date];

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *lastMonthComps = [[NSDateComponents alloc] init];
// [lastMonthComps setYear:1]; // year = 1表示1年后的时间 year = -1为1年前的日期,month day 类推
[lastMonthComps setMonth:-1];
NSDate *newdate = [calendar dateByAddingComponents:lastMonthComps toDate:currentDate options:0];



NSString *tmpbirthday = @"";
tmpbirthday = [QCT_Common date4YYMM:newdate];
NSLog(@"date str = %@", tmpbirthday);
// NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// [formatter setDateFormat:@"yyyy-MM"];
// NSString *dateStr = [formatter stringFromDate:newdate];

return tmpbirthday;
}

1.2 获取本月

/**
获取当前月份字符串
*/
+ (NSString *)strdate4TodaydateMonthlyStrYYMM{



NSDate *lastDay =[NSDate date];//

// NSDate *lastDay = [NSDate dateWithTimeInterval:-24*60*60 sinceDate:[NSDate date]];//前一天




NSString *tmpbirthday = @"";

tmpbirthday = [QCT_Common date4YYMM:lastDay];

return tmpbirthday;

}

II 获取前一天

+ (NSString *)strdate4lastDayYYMMDD{

NSDate *lastDay = [NSDate dateWithTimeInterval:-24*60*60 sinceDate:[NSDate date]];//前一天



NSString *tmpbirthday = @"";

tmpbirthday = [QCT_Common date4YYMMDD:lastDay];

return tmpbirthday;


}

III NSDate->NSString

+ (NSString *)date4YYMMDD:(NSDate *)date{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterMediumStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
[formatter setDateFormat:@"yyyy-MM-dd"];
return [formatter stringFromDate:date];
}

+ (NSString *)date4YYMM:(NSDate *)date{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterMediumStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
[formatter setDateFormat:@"yyyy-MM"];
return [formatter stringFromDate:date];
}

IV 案例:

4.1 构造退款单号

商户退款单号(商户退款单号,32个字符内、可包含字母,确保在商户系统唯一。同个退款单号多次请求,平台当一个单处理,只会退一次款。如果出现退款不成功,请采用原退款单号重新发起,避免出现重复退款。)


商户退款单号(out_refund_no):yyMMddHHmmss + xxxxxx(sid)+ 递增序号(隔天重置)


- (NSString *)out_refund_no{


NSMutableString *str = [[NSMutableString alloc]initWithString: [QCT_Common getyyMMddHHmmss4TodayTime]];
[str appendString:xxx.id];
[str appendString:QCTSession.shareQCTSession.snid];




return str;




}
  • snid(递增序号(隔天重置))
/**
yyMMddHHmmss + xxxxxx(6位sid)+ 5位序号

*/
- (NSString *)snid{


// 先从偏好获取对象,如果不存在就进行存储

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *k_sndi_keydic = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] dataForKey:k_sndi_key]];



NSString *str =@"00000";




NSString *todayStr = [QCT_Common date4YYMMDD:[NSDate date]];







if([k_sndi_keydic.allKeys containsObject:k_sndi_date_key]){



NSString *lastday = k_sndi_keydic[k_sndi_date_key];


str = [[NSMutableString alloc]initWithString: k_sndi_keydic[k_sndi_key]];






if([todayStr isEqualToString:lastday]){

int d = [str intValue]+1;


NSNumber *t = [NSNumber numberWithInt:d];




str = [QCT_Common addComplementspaces:t.description count:5 placeholder:@"0" isdirectionRight:NO];//



}else{



str = @"00000";
[k_sndi_keydic setValue:todayStr forKey:k_sndi_date_key];





}








}else{

k_sndi_keydic = [NSMutableDictionary dictionary];


[k_sndi_keydic setValue:todayStr forKey:k_sndi_date_key];

str = @"00000";





}



[k_sndi_keydic setValue:str forKey:k_sndi_key];



NSData *data = [NSKeyedArchiver archivedDataWithRootObject: k_sndi_keydic];




[user setValue:data forKey:k_sndi_key];

[user synchronize];




NSLog(@"str:%@",FMSTR(@"%@",str));//02022



return str;

}


 

/**


str: 原字符串
count: 补齐到第几位

placeholder: 补齐的符号

isdirectionRight: 是否往右补齐
*/
+ (NSString*)addComplementspaces:(NSString*)str count:(NSInteger)count placeholder:(NSString*)placeholder isdirectionRight:(BOOL)isdirectionRight{



NSLog(@"addComplementspacesstr:%@",FMSTR(@"%@",str));//02022


if (str.length>=count) {

return str;

}



NSMutableString *tmp = [NSMutableString new];

if(isdirectionRight){

tmp = [[NSMutableString alloc]initWithString:str];// 右补齐


}


NSInteger tmpcount = count -str.length;

for (int i =0; i< tmpcount; i++) {

[tmp appendString:placeholder];// 补齐


}

if(!isdirectionRight){
[tmp appendString:str];// 往左补齐

}

NSLog(@"addComplementspacesstr:%@",FMSTR(@"%@",tmp.description));//02022


return tmp.description;

}

4.2 获取最近30天的数据

  • 用法
NSInteger day  = [QCT_Common contrastTimeBackDayWithStartDate:weakSelf.filterViewModel.timeModel.startStr endDate:weakSelf.filterViewModel.timeModel.endStr];
NSLog(@"day: %ld",(long)day);


if (day > 29) {
[weakSelf showHUDMessage:QCTLocal(@"time_interval_should_not_exceed_30_days")];
return;
}
  • 工具方法
/**
计算两个时间的间隔(天)

@param start 开始时间
@param end 结束时间
@return 间隔时间
*/
+ (NSInteger)contrastTimeBackDayWithStartDate:(NSString *)start endDate:(NSString *)end
{
NSTimeInterval time = [self contrastTimeWithyyyyMMddStartDate:start endDate:end];
NSInteger minute,second,hour,day;
second=(NSInteger)time%1000;
minute = (NSInteger)(time/60)%60;
hour = (NSInteger)(time/3600)%24;
day = (time/3600/24);
return day;
}

/**
计算两个时间的间隔(毫秒)

@param start 开始时间
@param end 结束时间
@return 间隔时间
*/
+ (NSTimeInterval)contrastTimeWithyyyyMMddStartDate:(NSString *)start endDate:(NSString *)end
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// [dateFormatter setDateFormat:@"yyyy-MM-dd"];

[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"];


NSDate *startDate = [dateFormatter dateFromString:start];
NSDate *endDate = [dateFormatter dateFromString:end];
NSTimeInterval time = [endDate timeIntervalSinceDate:startDate];
return time;
}
  • 数据过滤: 获取最近7天的数据
// 数据过滤:  获取最近7天的数据
NSMutableString *str = [[NSMutableString alloc]initWithString: [QCT_Common get4TodayTimeWithDateFormat:@"yyyy-MM-dd HH:mm:ss"]];


NSMutableArray *tmp = [NSMutableArray array];

for (QCTReceiptDetailModel *obj in tmparr) {



NSInteger day = [QCT_Common contrastTimeBackDayWithStartDate:obj.completeTime endDate:str DateFormat:@"yyyy-MM-dd HH:mm:ss"];// endDate 大




NSLog(@"day: %ld",(long)day);

if (day > 6) {

}else{
[tmp addObject:obj];


}





}

/**
计算两个时间的间隔(天)

@param start 开始时间
@param end 结束时间
@return 间隔时间
*/
+ (NSInteger)contrastTimeBackDayWithStartDate:(NSString *)start endDate:(NSString *)end DateFormat:(NSString*)Format
{

NSTimeInterval time = [self contrastTimeWithStartDate:start endDate:end dateFormatter:Format];



NSInteger minute,second,hour,day;
second=(NSInteger)time%1000;
minute = (NSInteger)(time/60)%60;
hour = (NSInteger)(time/3600)%24;
day = (time/3600/24);
return day;
}

/**
计算两个时间的间隔(毫秒)

@param start 开始时间
@param end 结束时间
@return 间隔时间
*/
+ (NSTimeInterval)contrastTimeWithStartDate:(NSString *)start endDate:(NSString *)end dateFormatter:(NSString*)Formatter
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// [dateFormatter setDateFormat:@"yyyy-MM-dd"];

[dateFormatter setDateFormat:Formatter];



NSDate *startDate = [dateFormatter dateFromString:start];
NSDate *endDate = [dateFormatter dateFromString:end];
NSTimeInterval time = [endDate timeIntervalSinceDate:startDate];
return time;
}

4.3 时间格式化

  • 20210330105712->2021-03-30 10:57:12


同理2020年01月01日转成2020-01-01 ,可利用NSDateFormatter先把2020年01月01日字符串转NSDate,再把NSDate转成2020-01-01 字符串


payinfomodel.createTime  = [QCT_Common strdatedateFormat:@"yyyy-MM-dd HH:mm:ss" fromDateFormat:@"yyyyMMddHHmmss" objstr:refund_time_];// 格式化时间戳

iOS小技能: 时间处理(案例:构造退款单号、获取最近30天的数据)_字符串_02

+ (NSString *)strdatedateFormat:(NSString*)toDateFormat fromDateFormat:(NSString *)fromDateFormat objstr:(NSString*)objstr{


NSString *tmpbirthday = @"";

if(![NSStringQCTtoll isBlankString:objstr]){
tmpbirthday = objstr;



tmpbirthday = [QCT_Common date4ateFormat:toDateFormat withdate:[QCT_Common dateWithFormatterString:tmpbirthday dateFormat:fromDateFormat]];


}
return tmpbirthday;
}


+ (NSString *)date4ateFormat:(NSString *)DateFormat withdate:(NSDate *)date{

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterMediumStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
[formatter setDateFormat:DateFormat];

return [formatter stringFromDate:date];
}

+ (NSDate*)dateWithFormatterString:(NSString*)dateWithString dateFormat:(NSString*)dateFormat {

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
dateFormatter.dateFormat = dateFormat;
NSDate *date = [dateFormatter dateFromString:dateWithString];
return date;

}

see also

​1、请输入正确的结算卡号【银行卡号有效性校验Luhn算法】-银行卡号码校验算法2、身份证校验:【校验年龄、校验是否符合身份证号生成规则】​


 OC中的 BOOL不如bool好用

BOOL表示 1是YES , 所以非1是NO. 而bool表示0是false,所以非0是true;


???? 联系作者: iOS逆向(公号:iosrev)


???? 作者简介: 博客专家认证????丨全站 Top 50、华为云云享专家认证????、iOS逆向公号号主


???? 简历模板、技术互助。关注我,都给你。