Ios 如何以编程方式检查字符串的日期格式以获得正确的格式

Ios 如何以编程方式检查字符串的日期格式以获得正确的格式,ios,objective-c,ios7,nsdate,nsdateformatter,Ios,Objective C,Ios7,Nsdate,Nsdateformatter,以这个时间戳为例1993-11-14T00:00:00.000Z 我曾尝试使用以下日期格式将字符串转换为NSDate对象,但一直失败,因为我没有提供正确的格式。 无论如何,是否有一个程序检查,也许一个解析器会自动为我这样做 NSDateFormatter *inputDateFormat = [[NSDateFormatter alloc] init]; //Not correct format [inputDateFormat setDateFormat:@"yyyy-MM-ddTHH:mm:

以这个时间戳为例<代码>1993-11-14T00:00:00.000Z

我曾尝试使用以下日期格式将字符串转换为NSDate对象,但一直失败,因为我没有提供正确的格式。 无论如何,是否有一个程序检查,也许一个解析器会自动为我这样做

NSDateFormatter *inputDateFormat = [[NSDateFormatter alloc] init];
//Not correct format
[inputDateFormat setDateFormat:@"yyyy-MM-ddTHH:mm:ssZ"];
self.usersBirthDate = [inputDateFormat dateFromString:[dictionary objectForKey:@"birth_date"]];

}

您应该识别并使用正确的格式字符串。在这种情况下,正确的格式字符串为:

yyyy-MM-dd'T'HH:mm:ss.SSSZ
注意,在
T
周围加上单引号,并在末尾加上
.SSS
毫秒。顺便说一句,不要忘记设置
区域设置
,如中所述


在回答您的问题时,一个很有希望的选择是将
NSDataDetector
NSTextCheckingTypeDate
类型一起使用。令人惊讶的是,它实际上捕获了相当多的ISO 8601/RFC 3339日期排列。遗憾的是,它不能处理毫秒级的排列

不过,编写一个符合您描述的例程并不难。您可以使用正则表达式,例如:

- (NSDate *)dateFromString:(NSString *)string {
    static NSArray *formatStrings = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        formatStrings = @[@{kDateFormatRegex: @"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}$",    kDateFormatString: @"yyyy-MM-dd'T'HH:mm:ss.SSS"},
                          @{kDateFormatRegex: @"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$",             kDateFormatString: @"yyyy-MM-dd'T'HH:mm:ss"},
                          @{kDateFormatRegex: @"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$",   kDateFormatString: @"yyyy-MM-dd'T'HH:mm:ss.SSSZ"},
                          @{kDateFormatRegex: @"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$",            kDateFormatString: @"yyyy-MM-dd'T'HH:mm:ssZ"},
                          @{kDateFormatRegex: @"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}[A-Z]{3}$",     kDateFormatString: @"yyyy-MM-dd'T'HH:mm:ssz"},
                          @{kDateFormatRegex: @"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2} [A-Z]{3}$",    kDateFormatString: @"yyyy-MM-dd'T'HH:mm:ss z"},
                          @{kDateFormatRegex: @"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2} [+|-]\\d{4}$", kDateFormatString: @"yyyy-MM-dd'T'HH:mm:ss Z"}];
    });

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
    formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    for (NSDictionary *dictionary in formatStrings) {
        if ([string rangeOfString:dictionary[kDateFormatRegex] options:NSRegularExpressionSearch].location != NSNotFound) {
            formatter.dateFormat = dictionary[kDateFormatString];
            return [formatter dateFromString:string];
        }
    }

    return nil;
}

话虽如此,这似乎是一个非常低效的过程:我觉得最好知道web服务将采用哪种日期格式,并使用适当的格式字符串。但是,如果您想以编程方式检测模式,可以使用上面提到的正则表达式。只需扩展
formatStrings
字典,就可以包含您所关心的所有可能的排列

如果您提前知道格式,则无需进行编程检查。只需使用正确的格式字符串。