Pregunta

¿Cómo puedo analizar una cadena que representa una fecha y / u hora usando iPhone SDK si yo no sé el formato? Estoy construyendo una aplicación que permitirá una gama de posibles fechas y horas que se utilizará, y no quiero que falle debido a que el formato era "01/01/2001" en lugar de "01-01-2001", etc. . El tiempo puede estar o no incluido.

¿Hay alguna manera de hacer esto? He intentado usar NSDateFormatter con los estilos de fecha y hora establecidos en "NOstyle", y setLenient = SI, pero todavía no puede analizar el más simple de cadenas: "1/22/2009 12:00:00 PM"

No tengo manera de saber de antemano el formato, necesito un método que heurísticamente determinará el formato.

Yo vengo de un fondo de .NET, donde esto es tan simple como nuevo DateTime (string_in_any_format); pero no tengo ni idea de cómo hacer esto en Obj-C.

¿Fue útil?

Solución

Por desgracia, NSDateFormatter en el iPhone no es que inteligente. Es necesario darle un poco de orientación. Al configurar tanto los estilos de fecha y hora a NoStyle que espera ver ni una fecha ni hora. Usted necesitará por lo menos uno de ellos establece en algún otro estilo. Usted puede hacer algo como lo siguiente y que debería funcionar bien (lo hace para mí).

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

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

NSLog(@"%@", date);

Otros consejos

Mensaje viejo, pero hay mejores maneras de manejar esta situación que he encontrado en otros mensajes.

Se puede utilizar un método como este:

  • En primer lugar, a tratar de analizar la fecha en un par de formatos esperados.
  • Si eso no funciona, el uso NSDataDetector para tratar de encontrar información de fecha (referencia: este SO post).

Aquí hay un ejemplo de código que se utiliza para esto (que esperaba a los formatos de fecha pareja, pero no podía estar seguro de que es la única fecha que jamás había visto y no quiero fallar si es posible):

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

¿Cómo sería su potencial analizador determinará si es Jan 01/02/10 2 del 2010; Feb 1 del 2010; o algo completamente diferente? Bboth dd / mm / aa y dd / mm / aa son razonable esperar que, dependiendo de donde están sus clientes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top