美文网首页
NSDate+StringExt 日期和字符串互转,通用型

NSDate+StringExt 日期和字符串互转,通用型

作者: 山已几孑 | 来源:发表于2021-08-17 14:02 被阅读0次

当前我们常用的时间/日期互转的方法,主要是两种

  • 通过字符串强行匹配,查找到./-,分割,或者干脆直接根据格式中数字的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;
}

相关文章

网友评论

      本文标题:NSDate+StringExt 日期和字符串互转,通用型

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