通过NSDateFormatter从未知格式的字符串获取NSDate

时间:2012-02-09 18:47:40

标签: objective-c cocoa-touch nsdate nsdateformatter

我知道这里有很多NSDateFormatter个问题,所以如果我复制,我很抱歉。我找不到任何我想要的东西。

根据SO的所有问题,我得出的结论是,如果您的格式化程序对象没有正确的日期格式,-[NSDateFormatter dateFromString:]将始终返回NULL。如果您不知道格式,如何从字符串中获取日期?我正在尝试从UITextField获取约会。

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[NSLocale currentLocale]];
[formatter setLenient:YES];
NSDate *tempDate = [formatter dateFromString:self.birthdayTxtfld.text];
self.currentCustomer.birthday = ([self.birthdayTxtfld.text isEqualToString:@""]) ? NULL : tempDate;
[formatter release];

tempDate始终为NULL

2 个答案:

答案 0 :(得分:3)

我认为你采取了错误的做法。另一方面,我会限制和格式化UITextField,以便用户必须以特定格式输入日期。或者只使用日期选择器。用户也可以提供不同的输入。

或者您可以通读:NSDate

另一种选择是创建一个接受的日期格式列表: #define DATEFORMATS @[@"MM/dd/yyyy", @"MM/dd/yy",... 然后有一个方法将日期字符串传递给并检查是否可以格式化它:

+ (NSDateFormatter*)getDateFormat:(NSString*)dateString {

    NSArray *dateFormats = DATEFORMATS;
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    NSDate *date = nil;
    for (NSString *dateFormat in dateFormats) {
        [formatter setDateFormat:dateFormat];
        date = [formatter dateFromString:dateString];
        if (date) {
            return formatter;
        }
    }
    return nil;
}

如果你没有约会,那就不是约会,也不是你不支持的格式。否则,您将拥有所需的正确格式。您可以切换它以返回日期而不是格式。我这样做是因为我需要的格式不是项目的日期。

答案 1 :(得分:1)

虽然我同意@Jaybit你可能需要放弃文本框并使用更好的输入,但这个特定问题的答案在于一些狡猾的字符串解析。无论何时进行字符串解析,RegEx都是您的朋友。 Web开发人员最终不得不一直做这个垃圾。这个例子是在JavaScript中,但RegEx应该足够便携,以便在ObjC中工作:

http://www.codingoptimist.com/2009/07/using-javascript-and-regex-to-parse.html

您可以使用RegExKitNSRegularExpression

执行此操作