以此时间戳为例。 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"]];
}
答案 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
的字典,即可包含您关注的所有可能的排列。