2009-08-30 12 views
38

Tengo una cadena que contiene la fecha actual utilizando esta:NSString a NSDate

NSString *date = [[NSDate date] description]; 

en un punto diferente Quiero recuperar la fecha de esta cadena y he utilizado el siguiente código:

[NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehavior10_4]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
//[NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehaviorDefault]; 
[dateFormatter setDateFormat:@"YYYY-MM-DD HH:MM:SS ±HHMM"]; 

NSDate *dateFromString = [[NSDate alloc] init]; 
dateFromString = [dateFormatter dateFromString:<NSString containing date>]; 

Estoy obteniendo dateFromString como nil 0x0. ¿Qué estoy haciendo mal?

Respuesta

64

No puede inventar la sintaxis de cadenas de formato y esperar que funcione; necesitas usar un formato documentado. (En serio, "MM" significa "mes", "minuto" y "minutos GMT compensados", todo al mismo tiempo?)

Como señala el documentation, los formateadores 10.4 usan Unicode format strings.

Pruebe "aaaa-MM-dd HH: mm: ss ZZZ" en su lugar.

Además, la fuente Objective-C es ASCII. No coloque caracteres como ± y espere que funcione en cualquier contexto; en su lugar, use archivos de cadenas.

+1

Funciona muy bien – Minar

+0

Unicode UTF-8 funciona muy bien en la fuente. – Jonny

+1

Eso ha cambiado con el cambio a compiladores más nuevos desde que escribí mi respuesta original (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles/CreatingStrings.html#//apple_ref/doc/ uid/20000148-SW1). –

7

Además, dateFromString: devuelve un NSDate autoreleased, por lo que:

NSDate *dateFromString = [[NSDate alloc] init]; // <- non freed instance 
dateFromString = [dateFormatter dateFromString:<NSString containing date>]; // <- new autoreleased instance 
.... 
[dateFromString release]; // <- wrong 

Es posible que desee:

//NSDate *dateFromString = [[NSDate alloc] init]; 
NSDate *dateFromString = [dateFormatter dateFromString:<NSString containing date>]; 
.... 
//[dateFromString release]; // dateFromString is autoreleased 

Hope esto podría salvar a alguien :)

+0

¿Qué es dateFormatter? –

+0

De la pregunta en sí: NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; – grilix

-1

Como respondió con anterioridad, que es lo que sucede cuando inventas una nueva sintaxis.

Sobre la base de la documentación de Apple NSDateFormatter Class Reference

Hay muchos atributos que se pueden obtener y establecer una fecha estilo formateador, ... se le anima sin embargo, no cambiar los ajustes, individuales . En su lugar debe aceptar los ajustes por defecto establecidos en la inicialización y especificar el formato de usando setDateStyle :, setTimeStyle:

Esto es especialmente importante para la salida, que es diferente para cada configuración regional. Por defecto, NSDateFormatter observa la configuración regional actual del usuario. Entonces, el mismo NSDate podría ser 22.11.2011 18:33:19, o Nov 22, 2011 6:33:19 PM, o 2011-11-22 下午6:33:19 o incluso २२-११-२०११ ६:३३:१९ अपराह्, todos para la misma entrada y con el mismo código.

Considérese por ejemplo el código

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

[dateFormatter setDateStyle:NSDateFormatterShortStyle]; 
[dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 

// ShortStyle used: 11/23/37 3:30pm 
NSString *dateString = [dateFormatter stringFromDate:date]; 

Comprobar documentos de Apple para los diferentes estilos de NSDateFormatterStyle o esta excellent tutorial

2

debes revisar touchTime.

https://github.com/jheising/TouchTime.

Es un puerto directo de la increíble función strtotime en PHP en 5.4 para Cocoa y iOS. Adoptará casi cualquier formato arbitrario de cadena de fecha u hora y lo convertirá en un NSDate.

¡Espero que funcione, y disfruta!

2

Hecho un NSString extensión para eso.

// Simple as this. 
date = dateString.dateValue; 

Gracias a NSDataDetector, reconoce una gran cantidad de formato.

// Tested in GMT+1 (Hungary). 
@"2014-01-16" dateValue is <2014-01-16 11:00:00 +0000> 
@"2014.01.16" dateValue is <2014-01-16 11:00:00 +0000> 
@"2014/01/16" dateValue is <2014-01-16 11:00:00 +0000> 
@"2014 Jan 16" dateValue is <2014-01-16 11:00:00 +0000> 
@"2014 Jan 16th" dateValue is <2014-01-16 11:00:00 +0000> 
@"20140116" dateValue is <2014-01-16 11:00:00 +0000> 
@"01-16-2014" dateValue is <2014-01-16 11:00:00 +0000> 
@"01.16.2014" dateValue is <2014-01-16 11:00:00 +0000> 
@"01/16/2014" dateValue is <2014-01-16 11:00:00 +0000> 
@"16 January 2014" dateValue is <2014-01-16 11:00:00 +0000> 
@"01-16-2014 17:05:05" dateValue is <2014-01-16 16:05:05 +0000> 
@"01-16-2014 T 17:05:05 UTC" dateValue is <2014-01-16 17:05:05 +0000> 
@"17:05, 1 January 2014 (UTC)" dateValue is <2014-01-01 16:05:00 +0000> 

Parte de eppz!kit, agarra la categoría NSString+EPPZKit.h de GitHub.


respuesta original: Si usted no está seguro (o simplemente no les importa) sobre el formato de fecha que figura en la cadena, uso NSDataDetector Fecha análisis.

//Role players. 
NSString *dateString = @"Wed, 03 Jul 2013 02:16:02 -0700"; 
__block NSDate *detectedDate; 

//Detect. 
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingAllTypes error:nil]; 
[detector enumerateMatchesInString:dateString 
          options:kNilOptions 
          range:NSMakeRange(0, [dateString length]) 
         usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) 
{ detectedDate = result.date; }];