2010-06-07 14 views
13
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    dateFormatter.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]; 
    [dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss zzz"]; 
    NSString *dateString = @"Tue, 08 Jun 2010 17:00:00 EDT"; 
    NSDate *eventDate = [dateFormatter dateFromString:dateString]; 

En este caso, el objeto eventDate es nulo. ¿Puede alguien darme una pista? Este código solía funcionar.¿Qué pasa con la forma en que estoy usando NSDateFormatter?

ACTUALIZACIÓN: No puedo hablar de por qué esto no funciona debido a NDA. Baste decir, cuando iOS 4 esté fuera, publicaré la respuesta a mi propia pregunta.

+0

¿Está utilizando "NSString dateString" y "NSDate eventDate" o quiso decir "NSString * dateString" y "NSDate * eventDate"? – Dre

+0

Buena captura ... Este no es el código real copiado palabra por palabra. No quería dar demasiado contexto en la aplicación. –

+0

creo que deberías escribir dd en lugar de d en setDateFormat, pruébalo. – harshalb

Respuesta

4

La respuesta a esta pregunta es la siguiente: yo estaba usando el formato de fecha secuencia equivocada:

@"EEE, d MMM yyyy HH:mm:ss zzz" 

cuando debería haber sido:

@"EEE, dd MMM y HH:mm:ss zzz" 

La parte sobre iOS 4 y NDA fue que pensé que tenía que usar el método NSDateFormatterdateFormatFromTemplate:options:locale: que habría tenido este aspecto:

NSString *format = [NSDateFormatter dateFormatFromTemplate:@"EEE, d MMM yyyy HH:mm:ss zzz" options:0 locale:[NSLocale currentLocale]]; 

Sin embargo, este método sólo se debe utilizar cuando se quiere mostrar la fecha a un usuario de la configuración regional desconocido. En mi caso, sabía exactamente cómo se vería el formato de fecha y estaba intentando DEJAR caer la cadena de fecha para poder almacenarla en CoreData. Por lo tanto, ese método no fue útil.

Bono marcador: leer esta tabla con mucho cuidado y que sin duda averiguar cuál es el problema ... formatos de fecha Unicode deben seguir las siguientes especificaciones: http://unicode.org/reports/tr35/tr35-6.html#Date_Field_Symbol_Table

TL; DR La cadena de formato era incorrecto . D'oh!

64
/* 
    x   number 
    xx   two digit number 
    xxx   abbreviated name 
    xxxx  full name 

    a   AM/PM 
    A   millisecond of day 
    c   day of week (c,cc,ccc,cccc) 
    d   day of month 
    e   day of week (e,EEE,EEEE) 
    F   week of month 
    g   julian day (since 1/1/4713 BC) 
    G   era designator (G=GGG,GGGG) 
    h   hour (1-12, zero padded) 
    H   hour (0-23, zero padded) 
    L   month of year (L,LL,LLL,LLLL) 
    m   minute of hour (0-59, zero padded) 
    M   month of year (M,MM,MMM,MMMM) 
    Q   quarter of year (Q,QQ,QQQ,QQQQ) 
    s   seconds of minute (0-59, zero padded) 
    S   fraction of second 
    u   zero padded year 
    v   general timezone (v=vvv,vvvv) 
    w   week of year (0-53, zero padded) 
    y   year (y,yy,yyyy) 
    z   specific timezone (z=zzz,zzzz) 
    Z   timezone offset +0000 

    sql   y-M-d H:m:s 
    rss   [E, ]d MMM y[y] H:m:s Z|z[zzz] 
*/ 

Este es mi comentario para el análisis de la fecha. Uso lo siguiente, donde toDateUsingFormat usa un NSDateFormatter con la cadena pasada. No uso una configuración regional, porque las fechas rss no están localizadas.

if (0 == [string rangeOfString:@","].length) { 
     result = [string toDateUsingFormat:@"d MMM y H:m:s z"]; 
    } else { 
     result = [string toDateUsingFormat:@"E, d MMM y H:m:s z"]; 
    } 

Editar:

utilizo getObjectValue: en lugar de dateFromString.

NSDate *result = nil; 
NSError *error = nil; 
[dataFormatter getObjectValue:&result forString:dateString errorDescription:&error]; 
+0

El uso de una sola E no funcionó. Voy a probar el que tienes para RSS, ya que proviene de una fuente RSS. –

+0

Sí, eso tampoco funcionó ... Creo que podría ser algo roto en el iOS 4 Beta. ¡La razón por la que esto es tan frustrante es que solía funcionar bien! Protegido por NDA, así que supongo que es todo por ahora. –

+0

Aparece el siguiente mensaje de error con eso: "No se pudo completar la operación. (Error de cacao 2048.)" –

3

La lista completa de los especificadores de formato es UTS#35 Date Format Patterns.

¿El carácter 'c' funciona en lugar de 'E'? El documento lo tiene como una alternativa muy cercana y puede producir el resultado que desea.

(Si realmente quiere caracteres en la cadena de formato que no están en la tabla se puede escapar de ellos, como hh 'o''clock' a, zzzz -. Produce formato como las "12 horas de la tarde, hora del Pacífico")

0

El problema que encontré es que la cadena que estaba analizando tiene algunos caracteres finales "\ n \ t \ t". La solución fue para eliminarlos:

[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

+0

Desafortunadamente, este no es el problema en el código para la pregunta. Como puede ver allí, la fecha está codificada para el ejemplo. ¡Su solución podría ayudar a algunas personas! –

0

tiene un día sin relleno, es decir 08 en su cadena de fecha, sin embargo, en su cadena de formato el formato está tratando de analizar un día acolchado distinto de cero, es decir, d.cambiando d a dd debería solucionar el problema

Cuestiones relacionadas