Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在iphone上解析未知格式的日期字符串?_Iphone_Date Parsing - Fatal编程技术网

如何在iphone上解析未知格式的日期字符串?

如何在iphone上解析未知格式的日期字符串?,iphone,date-parsing,Iphone,Date Parsing,如果我不知道格式,如何使用iPhone SDK解析表示日期和/或时间的字符串?我正在构建一个应用程序,允许使用一系列可能的日期和时间,我不希望它失败,因为格式是“01/01/2001”,而不是“01-01-2001”,等等。时间可能包括也可能不包括在内 有没有办法做到这一点?我曾尝试使用NSDateFormatter,将日期和时间样式设置为“NoStyle”,setLenient=YES,但它仍然无法解析最简单的字符串:“1/22/2009 12:00:00 PM” 我没有办法事先知道格式,我需

如果我不知道格式,如何使用iPhone SDK解析表示日期和/或时间的字符串?我正在构建一个应用程序,允许使用一系列可能的日期和时间,我不希望它失败,因为格式是“01/01/2001”,而不是“01-01-2001”,等等。时间可能包括也可能不包括在内

有没有办法做到这一点?我曾尝试使用NSDateFormatter,将日期和时间样式设置为“NoStyle”,setLenient=YES,但它仍然无法解析最简单的字符串:“1/22/2009 12:00:00 PM”

我没有办法事先知道格式,我需要一种方法,将启发式地确定格式


我来自一个.NET背景,在那里这就像新的日期时间一样简单(任何格式的字符串);但我不知道如何在Obj-C中实现这一点。

不幸的是,iPhone上的NSDateFormatter没有那么智能。你需要给它一些指导。当您将日期和时间样式都设置为
NoStyle
时,它希望既看不到日期也看不到时间。至少需要将其中一个设置为其他样式。你可以做如下的事情,它应该工作得很好(对我来说是这样)


您的潜在解析器如何确定2010年2月1日是否为2010年1月2日;2010年2月1日;还是完全不同的东西?b mm/dd/yy和dd/mm/yy都是合理的预期,这取决于你的客户在哪里。

以前的帖子,但我在其他帖子上找到了更好的处理方法

您可以使用如下方法:

  • 首先,尝试用两种预期的格式解析日期
  • 如果不起作用,请使用
    NSDataDetector
    尝试查找日期信息(参考:)
下面是我用于此目的的代码示例(我希望有两种日期格式,但不能确定这是我见过的唯一日期,如果可能的话,我不想失败):


谢谢你的帮助。我可以看到,这将是一个有帮助的东西来建立,但由于它似乎没有提供,我将只建立我自己的。目前我只支持有限的格式。解析器可以根据语言环境采用一种或另一种格式,因此可以接受这种假设。但是,这是唯一可以接受的假设,因此,基本上,您需要的是如何使解析器不会对-和/?
NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterLongStyle];
[formatter setTimeStyle:NSDateFormatterNoStyle];
[formatter setLenient:YES];

NSDate * date = [formatter dateFromString:@"01-01/2001"];

NSLog(@"%@", date);
// 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 :(