Wie kann ich ein Datum Zeichenfolge in einem unbekannten Format auf iphone analysieren?

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

  •  28-09-2019
  •  | 
  •  

Frage

Wie kann ich eine Zeichenfolge analysieren, die ein Datum und / oder Uhrzeit mit iPhone SDK stellt, wenn ich das Format nicht kennen? Ich baue eine Anwendung, die eine Reihe von möglichen Terminen und Zeiten kann verwendet werden, und ich will es nicht scheitern, weil das Format „01/01/2001“ anstelle von „01.01.2001“ war, etc kann nicht aufgenommen werden oder nicht. Zeit.

Gibt es eine Möglichkeit, dies zu tun? Ich habe versucht, NSDateFormatter mit Datum und Uhrzeit Arten auf „nostyle“ und setLenient = YES verwenden, aber es immer noch nicht die einfachste von Strings zu analysieren: „2009.01.22 12.00.00“

Ich habe keine Möglichkeit, das Format im Voraus zu wissen, ich brauche eine Methode, die das Format heuristisch bestimmen wird.

Ich komme aus einem .NET-Hintergrund, wo dies so einfach wie neue Datetime (string_in_any_format); aber ich habe keine Ahnung, wie dies zu tun in Obj-C.

War es hilfreich?

Lösung

Leider NSDateFormatter auf dem iPhone ist nicht , die smart. Sie müssen es ein wenig Anleitung geben. Wenn Sie beide die Datums- und Zeitformate auf NoStyle es weder ein Datum noch Zeit, um zu sehen erwartet. Sie müssen mindestens einen von ihnen zu einem anderen Stil. Sie können so etwas wie die folgenden tun und es sollte funktionieren (es tut für mich).

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

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

NSLog(@"%@", date);

Andere Tipps

Alte Post, aber es gibt bessere Möglichkeiten, dies zu umgehen, dass ich auf andere Einträge gefunden.

Sie können eine Methode wie diese verwenden:

  • Versuchen Sie zuerst, und das Datum in ein paar erwartet Formate zu analysieren.
  • Wenn das nicht funktioniert, verwenden NSDataDetector zu versuchen und finden aktuelle Informationen (Referenz: diese SO Post ).

Hier ist ein Beispiel für Code, den ich dafür verwendet (ich erwartet hatte ein paar Datumsformate, konnte aber nicht sicher sein, dass der einzige Zeitpunkt ist würde ich jemals sehen und wollte nicht versagen, wenn möglich):

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

Wie würden Sie Ihre potentielle Parser festzustellen, ob 01.02.10 ist 2. Januar 2010; 1, Februar 2010; oder etwas ganz anderes? Bboth mm / tt / jj und TT / MM / JJ ist vernünftig zu erwarten, je nachdem, wo Ihre Kunden sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top