Domanda

Come posso analizzare una stringa che rappresenta una data e / o l'ora utilizzando iPhone SDK se non so il formato? Sto costruendo un'applicazione che permetterà una serie di possibili date e orari da utilizzare, e io non voglio che a fallire perché il formato è stato "01/01/2001" invece di "2001/01/01", ecc . Il tempo può o non può essere inclusa.

Esiste un modo per fare questo? Ho provato con NSDateFormatter con data e ora gli stili impostati a "NoStyle", e setLenient = SI, ma non riesce ancora a analizzare la più semplice delle stringhe: "2009/01/22 12:00:00"

Non ho modo di sapere il formato in anticipo, ho bisogno di un metodo che euristicamente determinare il formato.

io vengo da un ambiente .NET, dove questo è semplice come nuovo DateTime (string_in_any_format); ma non ho idea di come fare questo in Obj-C.

È stato utile?

Soluzione

Purtroppo, NSDateFormatter su iPhone non è che intelligente. È necessario dare un po 'di orientamento. Quando si imposta sia la data e l'ora stili per NoStyle si aspetta di vedere né una data né tempo. Avrete bisogno di almeno uno di essi impostato su qualche altro stile. Si può fare qualcosa di simile a quanto segue e dovrebbe funzionare bene (lo fa per me).

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

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

NSLog(@"%@", date);

Altri suggerimenti

Old post, ma ci sono modi migliori per gestire questo che ho trovato su altri post.

È possibile utilizzare un metodo come questo:

  • In primo luogo, cercare di analizzare la data in un paio di formati previsti.
  • Se questo non funziona, l'uso NSDataDetector per cercare di trovare informazioni relative alla data (di riferimento: questo SO post).

Ecco un esempio di codice che ho usato per questo (mi aspettavo una data Coppia formati, ma non poteva essere certi che è l'unica data che abbia mai visto e non volevo fallire se possibile):

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

Come sarebbe la tua parser potenziale determinare se 01/02/10 è 2 gennaio 2010; feb 1, 2010; o qualcosa di completamente diverso? Bboth mm / gg / aa e gg / mm / aa sono ragionevole aspettarsi, a seconda di dove sono i clienti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top