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

时间:2014-10-25 03:04:43

标签: 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:ssZ"];
self.usersBirthDate = [inputDateFormat dateFromString:[dictionary objectForKey:@"birth_date"]];

}

1 个答案:

答案 0 :(得分:4)

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

yyyy-MM-dd'T'HH:mm:ss.SSSZ

注意,T周围的单引号,并在结尾添加.SSS毫秒。顺便说一句,不要忘记设置Technical Q&A QA1480中讨论的locale


在回答您的问题时,一个有希望的替代方案是使用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的字典,即可包含您关注的所有可能的排列。