美文网首页
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