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

2021-08-17  本文已影响0人  山已几孑

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

说说优缺点:

最后,考虑了一下通过正则,匹配日期字符串,最后解析
优点就是:
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;
}
上一篇 下一篇

猜你喜欢

热点阅读