Comment puis-je analyser une chaîne de date dans un format inconnu sur iphone?

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

  •  28-09-2019
  •  | 
  •  

Question

Comment puis-je analyser une chaîne qui représente une date et / ou le temps d'utiliser l'iPhone SDK si je ne connais pas le format? Je construis une application qui permettra une plage de dates et heures possibles à utiliser, et je ne veux pas échouer parce que le format était « 01/01/2001 » au lieu de « 01-01-2001 », etc. . Le temps peut ou non être inclus.

Est-il possible de le faire? Je l'ai essayé d'utiliser NSDateFormatter avec la date et les styles temps mis à « Nostyle », et setLenient = OUI, mais il ne parvient toujours pas à analyser la plus simple des chaînes: « 1/22/2009 12:00:00 PM »

Je n'ai aucun moyen de connaître le format à l'avance, je besoin d'une méthode qui heuristically déterminer le format.

Je viens d'un milieu .NET, lorsque cela est aussi simple que nouvelle DateTime (string_in_any_format); mais je ne sais pas comment faire en Obj-C.

Était-ce utile?

La solution

Malheureusement, NSDateFormatter sur l'iPhone n'est pas que smart. Vous devez lui donner un peu d'orientation. Lorsque vous définissez les deux styles de date et l'heure à NoStyle il attend de voir ni la date ni le temps. Vous aurez besoin d'au moins un d'entre eux mis à un autre style. Vous pouvez faire quelque chose comme ce qui suit et il devrait fonctionner correctement (il le fait pour moi).

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

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

NSLog(@"%@", date);

Autres conseils

Ancien poste, mais il y a de meilleures façons de gérer ce que j'ai trouvé sur d'autres postes.

Vous pouvez utiliser une méthode comme ceci:

  • Tout d'abord, essayer et analyser la date dans deux formats attendus.
  • Si cela ne fonctionne pas, utilisez NSDataDetector pour essayer de trouver des informations de date (référence: ce SO après ).

Voici un exemple de code I utilisé pour cela (je m'y attendais un des formats de date couple, mais ne pouvait pas être certain que est la seule date que je avais jamais vu et je ne voulais pas échouer si possible):

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

Comment votre analyseur potentiel déterminer si 01/02/10 est le 2 janvier 2010; 1 février 2010; ou tout autre chose? Bboth mm / jj / aa et jj / mm / aa sont raisonnables à attendre, selon l'endroit où vos clients.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top