كيف يمكنني تحليل سلسلة تاريخ بتنسيق غير معروف على iPhone؟

StackOverflow https://stackoverflow.com/questions/3485209

  •  28-09-2019
  •  | 
  •  

سؤال

كيف يمكنني تحليل سلسلة تمثل تاريخًا و/أو وقتًا باستخدام iPhone SDK إذا كنت لا أعرف التنسيق؟ أقوم ببناء تطبيق يسمح بمجموعة من التواريخ والأوقات المحتملة لاستخدامها ، ولا أريد أن يفشل لأن التنسيق كان "01/01/2001" بدلاً من "01-01-2001" ، إلخ . قد يتم أو لا يتم تضمين الوقت.

هل هناك أي طريقة للقيام بذلك؟ لقد حاولت استخدام NSDateFormatter مع أنماط التاريخ والوقت المعين على "Nostyle" ، و setLenient = نعم ، لكنه لا يزال يفشل في تحليل أبسط الأوتار: "1/22/2009 12:00:00 مساءً"

ليس لدي أي وسيلة لمعرفة التنسيق مقدمًا ، أحتاج إلى طريقة ستحدد التنسيق بشكل عالي.

أنا قادم من خلفية .NET ، حيث يكون هذا بسيطًا مثل DateTime (string_in_any_format) ؛ لكن ليس لدي أي فكرة عن كيفية القيام بذلك في OBJ-C.

هل كانت مفيدة؟

المحلول

للأسف، NSDateFormatter على iPhone ليس الذي - التي ذكي. تحتاج إلى إعطائها القليل من التوجيه. عندما تقوم بتعيين كل من أنماط التاريخ والوقت على NoStyle لا يتوقع أن يرى تاريخًا ولا وقت. ستحتاج إلى واحد منهم على الأقل لبعض الأسلوب الآخر. يمكنك أن تفعل شيئًا مثل ما يلي ويجب أن يعمل بشكل جيد (إنه بالنسبة لي).

NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterLongStyle];
[formatter setTimeStyle:NSDateFormatterNoStyle];
[formatter setLenient:YES];

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

NSLog(@"%@", date);

نصائح أخرى

Post Old ، ولكن هناك طرق أفضل للتعامل مع هذا وجدت في منشورات أخرى.

يمكنك استخدام طريقة مثل هذه:

  • أولاً ، حاول تحليل التاريخ في تنسيقات متوقعة.
  • إذا لم ينجح ذلك ، فاستخدم NSDataDetector لمحاولة العثور على معلومات التاريخ (المرجع: هذا بعد ذلك).

إليك عينة من الكود الذي استخدمته لهذا (كنت أتوقع تنسيقات تاريخان ، لكن لم يكن من الممكن أن يكون على يقين من أن هذا هو التاريخ الوحيد الذي أراه ولا أريد أن أفشل إذا كان ذلك ممكنًا):

// 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 :(

كيف سيحدد محللك المحتمل ما إذا كان 01/02/10 هو 2 يناير 2010 ؛ 1 فبراير 2010 ؛ أو شيء مختلف تماما؟ BBOTH MM/DD/YY و DD/MM/YY معقولة للتوقع ، اعتمادًا على مكان عملائك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top