2010-02-28 19 views
6

He leído la guía de DateFormatting y todavía no puedo obtener un formateador que funcione.NSDate from NSString

NSString *string = @"0901Z 12/17/09"; 
//This is a sample date. The Z stands for GMT timezone 
//The 0901 is 09h 01m on a 24 hour clock not 12. 
//As long as I can get the hours/min & date from the string I can deal with the time zone later 
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"hhmm'Z' MM/dd/yy"]; 
NSDate *date = [dateFormat dateFromString:string]; 

Respuesta

7

Eso funciona para mí cuando lo intento. Añadiendo NSLog(@"%@", date) hasta el final de su código me da este resultado:

2010-02-28 12:17:22.921 app[9204:a0f] 2009-12-17 09:01:00 -0800 

¿Cuál es el problema que se está viendo?

Edit: lo descubrí, no estás teniendo un problema con 09:01, pero con otras 24 horas, como 14:25, ¿verdad? Cambiar su formateador a:

@"HHmm'Z' MM/dd/yy" 
+0

que era lo 24 horas conseguirme al parecer. Gracias. – jamone

1

Copiado de una pregunta similar respondí aquí: NSDateFormatter returns nil for @"dd-MM-yy" in iOS 3.0

Si está trabajando con las fechas visibles para el usuario, no debe ajustar una cadena de formato de fecha. Formatear las fechas de esta manera no es localizable y hace que sea imposible predecir cómo se expresará su cadena de formato en todas las configuraciones de usuario posibles. En su lugar, debe intentar limitarse a establecer estilos de fecha y hora (a través de [NSDateFormatter setDateStyle:] y - [NSDateFormatter setTimeStyle:]).

Por otro lado, si está trabajando con fechas de formato fijo, primero debe establecer la configuración regional del formateador de fechas en algo apropiado para su formato fijo. En la mayoría de los casos, la mejor ubicación para elegir es "en_US_POSIX", una configuración regional específicamente diseñada para generar resultados en inglés de EE. UU. Independientemente de las preferencias del usuario y del sistema. "en_US_POSIX" también es invariante en el tiempo (si EE. UU., en algún momento en el futuro, cambia la forma en que da formato a las fechas, "en_US" cambiará para reflejar el nuevo comportamiento, pero "en_US_POSIX" no), y entre máquinas ("en_US_POSIX" funciona igual en iPhone OS que en Mac OS X, y como lo hace en otras plataformas).

Una vez que haya configurado "en_US_POSIX" como la configuración regional del formateador de fecha, puede establecer la cadena de formato de fecha y la fecha del formateador se comportará de forma coherente para todos los usuarios.

La información anterior y mucho más se puede encontrar en la Technical Q&A QA1480

He aquí un fragmento de código desde mi aplicación que implementa la recomendación anterior de Apple:

static NSDateFormatter* dateFormatter = nil; 
if (!dateFormatter) { 
dateFormatter = [[NSDateFormatter alloc] init]; 
NSLocale *enUSPOSIXLocale = [[[NSLocale alloc] 
      initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]; 
NSAssert(enUSPOSIXLocale != nil, @"POSIX may not be nil."); 
[dateFormatter setLocale:enUSPOSIXLocale]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

dateFormatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss +0000"; 
}