在Objective-C中如何处理带字母后缀的缩写日期日份?
带序数后缀的日期字符串解析与生成方案
NSDate的dateWithNaturalLanguageString:方法已废弃,直接用NSDateFormatter设置@"MMM dd, yyyy"格式无法解析@"Aug 2nd, 2010"这类带序数后缀(st/nd/rd/th)的日期字符串,同时原生格式也不支持直接生成这类带后缀的日期。以下是可行的实现方案:
解析带序数后缀的日期
先对原始字符串做预处理,移除日份后的序数后缀,再用常规格式解析:
- 用正则表达式匹配并替换掉
数字+序数后缀的部分,将"Aug 2nd, 2010"转换为"Aug 2, 2010" - 使用
@"MMM d, yyyy"格式(d兼容1位/2位数字日份)配合en_US_POSIX区域设置解析,避免系统区域影响
示例代码:
NSString *rawDateStr = @"Aug 2nd, 2010"; // 正则匹配序数后缀并移除 NSRegularExpression *ordinalRegex = [NSRegularExpression regularExpressionWithPattern:@"(\d+)(st|nd|rd|th)" options:0 error:nil]; NSString *cleanedDateStr = [ordinalRegex stringByReplacingMatchesInString:rawDateStr options:0 range:NSMakeRange(0, rawDateStr.length) withTemplate:@"$1"]; // 解析处理后的字符串 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"MMM d, yyyy"; formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; NSDate *parsedDate = [formatter dateFromString:cleanedDateStr];
生成带序数后缀的日期
先提取日期的日份数字,再根据规则添加对应的序数后缀:
- 规则:1st、2nd、3rd;11-13例外(11th、12th、13th);其余数字统一加th
- 拼接日份+后缀与其他日期部分,生成目标格式字符串
示例代码:
NSDate *targetDate = [NSDate date]; // 获取日份数字 NSDateFormatter *dayFormatter = [[NSDateFormatter alloc] init]; dayFormatter.dateFormat = @"d"; NSInteger dayNum = [[dayFormatter stringFromDate:targetDate] integerValue]; // 确定序数后缀 NSString *ordinalSuffix; if (dayNum >= 11 && dayNum <= 13) { ordinalSuffix = @"th"; } else { switch (dayNum % 10) { case 1: ordinalSuffix = @"st"; break; case 2: ordinalSuffix = @"nd"; break; case 3: ordinalSuffix = @"rd"; break; default: ordinalSuffix = @"th"; break; } } // 拼接完整日期字符串 NSDateFormatter *baseFormatter = [[NSDateFormatter alloc] init]; baseFormatter.dateFormat = @"MMM "; NSString *datePrefix = [baseFormatter stringFromDate:targetDate]; baseFormatter.dateFormat = @"yyyy"; NSString *dateYear = [baseFormatter stringFromDate:targetDate]; NSString *finalDateStr = [NSString stringWithFormat:@"%@%ld%@, %@", datePrefix, (long)dayNum, ordinalSuffix, dateYear];
目前系统没有提供原生的日期格式支持直接处理序数后缀,必须通过上述预处理和自定义后缀逻辑来实现需求。
内容的提问来源于stack exchange,提问作者ilgaar
相关产品推荐
相关产品推荐

