You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 17:50:36