当前我们常用的时间/日期互转的方法,主要是两种
- 通过字符串强行匹配,查找到
./-
,分割,或者干脆直接根据格式中数字的offset,强行找到年月日字符串。 - 通过NSDateFormatter,先把字符串转成时间,再通过另一个formatter转成字符串返回回去。
说说优缺点:
- 第一种,速度最快,改成C语言之后更快,但是,没有日期正确性的校验,仅仅是拿到。并且,当月份是1-9(不是09)时,解析出现问题。
- 第二种,有了最基本的日期校验,速度较第一种慢,也没慢多少,慢个二十多倍???
- 两种都依赖于输入日期的格式。格式不对,一切皆休。
最后,考虑了一下通过正则,匹配日期字符串,最后解析,
优点就是:
1.可以传入常用格式的字符串,如:1920/2/1 1920-2-1 1920.2.1
2.当日期不正确是会进行一定程度的修正,如1920.2.31=>1920.3.2,
如果日期可以被识别, HHmm部分发生错误,那么时间部分被设置为12:00:00
如果日期可以被识别, ss部分发生错误,那么时间部分被设置为HH:mm:00
缺点就是执行速度减慢了,毕竟多了校验,匹配的工作量
速度么,也就比第二种慢个6.倍左右,
忽然感觉我写这个,没有个鸡毛用啊,一个比一个慢,省点心?😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂
代码如下:
NSDate+StringExt.h
/**
输入字符串,返回时间信息,
输入格式不限,如:“1920.02.31” “1920-2-31” “1920.02.31 12:12:21” ”1920.02.31 12:12“ ”20.02.31“
当日期不正确是会进行一定程度的修正,如1920.2.31=>1920.3.2,
* 但如果太离谱返回为nil,比如1920.2.32
* 如果日期可以被识别, HHmm部分发生错误,那么时间部分被设置为12:00:00
* 如果日期可以被识别, ss部分发生错误,那么时间部分被设置为HH:mm:00
* 如果只输入时间如:@“12:21:32”, 会默认当天,若HH:mm发生错误(如 @”25:21:32“),会返回nil,ss部分发生错误,ss被设置为00
*/
/// 根据日期字符串获取 指定格式的日期字符串
/// @param dateString 输入字符串,格式不限,当日期不正确是会进行一定程度的修正,如1920.2.31=>1920.3.2,如果太离谱就会报错,比如1920.2.32
/// @param targetFormatter 输入格式如:@“yyyy.MM.dd”
+ (NSString * __nullable)formatterDateWithString:(NSString *_Nullable)dateString targetFormatter:(NSString *_Nonnull)targetFormatter;
/// 根据日期字符串获取Date
/// @param dateString 日期字符串,格式不限,当日期不正确是会进行一定程度的修正,如1920.2.31=>1920.3.2,如果太离谱就会返回null,比如1920.2.32 or 35:59:59,例外:如果只输入时间如:@“12:21:32”,此类会默认当天,但若时间错误,返回null,如果秒的数值错误,会默认00
+ (NSDate * __nullable)formatterDateWithString:(NSString *_Nullable)dateString;
NSDate+StringExt.m
+ (NSString * __nullable)formatterDateWithString:(NSString *_Nullable)dateString targetFormatter:(NSString *_Nonnull)targetFormatter{
__block NSString * __nullable formatterString;
NSError * error;
//写正则对象,根据规则
NSDataDetector * detechtor = [[NSDataDetector alloc] initWithTypes:(NSTextCheckingTypeDate) error:&error];
[detechtor enumerateMatchesInString:dateString options:NSMatchingAnchored|NSMatchingReportCompletion range:NSMakeRange(0, dateString.length) usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
if (result.resultType == NSTextCheckingTypeDate) {
//匹配到就停止
NSDateFormatter * formatter = [[NSDateFormatter alloc]init];
formatter.dateFormat = targetFormatter;
formatter.timeZone = [NSTimeZone systemTimeZone];
formatterString = [formatter stringFromDate:result.date];
*stop = true;
}
}];
//否则返回是空
return formatterString;
}
+ (NSDate * __nullable)formatterDateWithString:(NSString *_Nullable)dateString {
__block NSDate *__nullable targetDate;
NSError * error;
//写正则对象,根据规则
NSDataDetector * detechtor = [[NSDataDetector alloc] initWithTypes:(NSTextCheckingTypeDate) error:&error];
[detechtor enumerateMatchesInString:dateString options:NSMatchingAnchored|NSMatchingReportCompletion range:NSMakeRange(0, dateString.length) usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
if (result.resultType == NSTextCheckingTypeDate) {
//匹配到就停止
targetDate = result.date;
*stop = true;
}
}];
//否则返回是空
return targetDate;
}
网友评论