如果我不知道格式,如何使用iPhone SDK解析代表日期和/或时间的字符串?我正在构建一个允许使用一系列可能日期和时间的应用程序,我不希望它失败,因为格式为“01/01/2001”而不是“01-01-2001”等时间可能包括也可能不包括在内。
有没有办法做到这一点?我已经尝试使用NSDateFormatter,日期和时间样式设置为“NoStyle”,并且setLenient = YES,但它仍然无法解析最简单的字符串:“1/22/2009 12:00:00 PM”
我无法提前知道格式,我需要一种启发式确定格式的方法。
我来自.NET背景,这就像新的DateTime(string_in_any_format)一样简单;但我不知道如何在Obj-C中做到这一点。
答案 0 :(得分:4)
不幸的是,iPhone上的NSDateFormatter
并非 智能。你需要给它一点指导。当您将日期和时间样式都设置为NoStyle
时,它既不会看到日期,也不会看到时间。你至少需要其中一个设置为其他风格。您可以执行以下操作,它应该可以正常工作(它适用于我)。
NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterLongStyle];
[formatter setTimeStyle:NSDateFormatterNoStyle];
[formatter setLenient:YES];
NSDate * date = [formatter dateFromString:@"01-01/2001"];
NSLog(@"%@", date);
答案 1 :(得分:3)
旧帖子,但是我在其他帖子上找到了更好的方法来处理这个问题。
您可以使用以下方法:
NSDataDetector
尝试查找日期信息(参考:this SO post)。以下是我用于此的代码示例(我预计会有几种日期格式,但无法确定这是我见过的唯一日期,如果可能的话也不想失败):
// your date formats may vary, the OP might try "MM/dd/yyyy" and "MM-dd-yyyy", along with combos that include time info
NSArray *dateFormatsToTry = @[@"yyyy-MM-dd'T'HH:mmZZZZ", @"yyyy-MM-dd'T'HH:mm:ssZZZ"];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
for (NSString * format in dateFormatsToTry) {
[dateFormatter setDateFormat:format];
NSDate *date = [[[self class] sharedDateFormatter] dateFromString:dateString];
if (date) {
return date;
}
}
// try and figure out the date if the all of the expected formats failed to
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeDate error:nil];
NSTextCheckingResult *result = [detector firstMatchInString:dateString options:0 range:NSMakeRange(0, [dateString length])];
if ([result resultType] == NSTextCheckingTypeDate) {
NSDate * date = [result date];
if (date) {
return date;
}
}
return [NSDate date]; // default to now :(
答案 2 :(得分:0)
您的潜在解析器如何确定01/02/10是否是2010年1月2日; 2010年2月1日;还是完全不同的东西? Bboth mm / dd / yy和dd / mm / yy是合理的,取决于您的客户所在。