2011-04-12 18 views
14

Tengo el siguiente código:dateFromString siempre devuelve un valor nulo con dateformatter

NSDateFormatter * df = [[NSDateFormatter alloc] init]; 
    [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
    [df setTimeZone:[NSTimeZone systemTimeZone]]; 
    [df setFormatterBehavior:NSDateFormatterBehaviorDefault]; 

    [df dateFromString:@"2011-04-12 10:00:00"]; 

En lo que siempre genera una fecha nulos. ¿Por qué es esto?

+4

Parece la misma pregunta que hizo ayer pero simplificó. Debe modificar la pregunta original. Algunos de nosotros pasamos mucho tiempo tratando de ayudarte. http://stackoverflow.com/questions/5628062/memory-management-and-global-variable/5628202#5628202 – XJones

Respuesta

18

¿Estás haciendo esto en un hilo de fondo? Tuve experiencias extrañas con NSDateFormatter cuando no se usaba en el hilo de la interfaz de usuario. De todos modos, aquí está el método que uso, debería funcionar para usted:

+ (NSDate*)parseDate:(NSString*)inStrDate format:(NSString*)inFormat { 
    NSDateFormatter* dtFormatter = [[NSDateFormatter alloc] init]; 
    [dtFormatter setLocale:[NSLocale systemLocale]]; 
    [dtFormatter setDateFormat:inFormat]; 
    NSDate* dateOutput = [dtFormatter dateFromString:inStrDate]; 
    [dtFormatter release]; 
    return dateOutput; 
} 
4

Acabo de ejecutar este código y funcionó para mí.

NSDateFormatter * df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
[df setTimeZone:[NSTimeZone systemTimeZone]]; 
[df setFormatterBehavior:NSDateFormatterBehaviorDefault]; 

NSDate *theDate = [df dateFromString:@"2011-04-12 10:00:00"]; 
NSLog(@"date: %@", theDate); 

La salida fue: Fecha: 2011-04-12 17:00:00 +0000

+0

Olvidó el: NSDate * theDate = – NWCoder

0

intenta establecer la fecha formateadores ambos en el mismo formato al convertir (fecha de cuerdas) y (cadena hasta la fecha) .En el siguiente formato

[formatter1 setDateFormat:@"MM/dd/yyyy hh:mm:ss a"] 

[formatter2 setDateFormat:@"MM/dd/yyyy hh:mm:ss a"] 
4

Sí, estuvo de acuerdo con @Jan Gressmann, esto es tan extraño! Estoy utilizando el NSDateFormatter de rosca no ui así, y vuelve selector dateFromString nula veces ... Por ejemplo, tengo este código :

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
[dateFormat setLocale:usLocale]; 
[dateFormat setDateFormat:@"dd MMM yy HH:mm:ss"]; 
NSDate *startDate = [dateFormat dateFromString:str_StartDate]; 
NSDate *endDate = [dateFormat dateFromString:str_endDate]; 

salida en la consola:

(lldb) po str_StartDate 
(NSString *) $7 = 0x06da2180 03 SEP 2012 10:00:00 
(lldb) po str_endDate 
(NSString *) $8 = 0x06d3a810 08 SEP 2013 10:00:00 
(lldb) po startDate 
(NSDate *) $9 = 0x00000000 <nil> 
(lldb) po endDate 
(NSDate *) $10 = 0x06db05b0 2013-09-08 02:00:00 +0000 

Esto es realmente extraño ...

8

Tuve el mismo problema. Empecé por verificar dos veces que la cadena utilizada para la conversión era válida usando this resource.

luego tuve un pensamiento que podría ser el entorno local, así que probé el siguiente:

[dateFomatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_AU"]]

funcionó como un encanto. Espero que esto ayude.

29

Si el dispositivo está configurado para AM hora/PM y pidió formato de cadena se establece en @"yyyy-MM-dd HH:mm:ss"dateFromString volverá nil.

Si configura la configuración regional en @"en_US", la conversión devolverá la fecha correcta.

dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; 
[dateFormat setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]]; 
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
NSDate *date = [dateFormat dateFromString:@"2013-02-14 09:30:00"]; 
+0

Incluso haciendo un control y configurando el formato a "hh: mm a " No funciona. Esto hace. ¡Gracias! – Jasper

3

me estaba problema similar con iOS8 (XCode 6), lo hice después de los cambios en NSDateFormatter -

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 

[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 

NSDate *formattedDate = [dateFormatter dateFromString:dateString]; 
+1

Configuración de la zona horaria con la abreviatura "UTC" me ayudó. Gracias – Vladimir

0

que tienen el problema similar con usted, dateFromString: éxito en el simulador de iOS, mientras que en iPhone , que siempre vuelven NULL, después de añadir el código de abajo, unido con dateFormatter, que el éxito en el simulador de iPhone anuncio:

[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]]; 
2

dateFromString y stringFromDate retorno nula debido dispositivo formato de tiempo (por ejemplo: 12hr o 24hr) y dispositivo zona horaria de 12 horas

Convertir a las 24 horas

- (NSString*)getTimeIn24Hr:(NSString*)time12hrWithDate 
{ 
    NSDateFormatter* df12 = [[NSDateFormatter alloc] init]; 
    [df12 setTimeZone:[NSTimeZone systemTimeZone]]; 
    [df12 setDateFormat:@"yyyy-MM-dd hh:mm a"]; 
    NSDate* dateTime12hr = [df12 dateFromString:time12hrWithDate]; 

    NSDateFormatter *df24 = [[NSDateFormatter alloc]init]; 
    [df24 setLocale:[NSLocale systemLocale]]; 
    [df24 setDateFormat:@"HH:mm:ss"]; 
    NSString * time24HrOutput = [df24 stringFromDate:dateTime12hr]; 

    return time24HrOutput; 
} 

Convert 24hr a 12hr

- (NSString*)getTimeIn12Hr:(NSString*)time24hrWithDate 
{ 
    NSDateFormatter* df24 = [[NSDateFormatter alloc] init]; 
    [df24 setLocale:[NSLocale systemLocale]]; 
    [df24 setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
    NSDate* dateTime24hr = [df24 dateFromString:time24hrWithDate]; 

    NSDateFormatter *df12 = [[NSDateFormatter alloc]init]; 
    [df12 setDateFormat:@"hh:mm a"]; 
    NSString * time12HrOutput = [df12 stringFromDate:dateTime24hr]; 

    return time12HrOutput; 
} 
0

Puede usar este formato "yyyy-MM-dd hh:mm:ss".

La clave es usar downcased hh en lugar de HH para formatear horas cuando se utiliza en swift2.3 iOS10

la esperanza de que podría ser útil.

Cuestiones relacionadas