NSString a NSDate


Obtuve una cadena que contiene la fecha actual usando esto :

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

En un punto diferente quiero recuperar la fecha de esta cadena y usé 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?

Author: ZelluX, 2009-08-30

5 answers

No se puede inventar la sintaxis de cadena de formato y esperar que funcione; se necesita realmente usar un formato documentado. (En serio, " MM "significa " mes", "minuto" y "GMT offset minutes" todo al mismo tiempo?)

Como señala la documentación , los formateadores 10.4 usan cadenas de formato Unicode.

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

También, la fuente de Objective-C es ASCII. No pongas caracteres como ± ahí y esperes que funcionen en cualquier contexto; en su lugar, usar archivos strings.

 64
Author: Nicholas Riley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-30 04:35:59

También, dateFromString: devuelve un NSDate autoreleased, así 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

Espero que esto pueda salvar a alguien:)

 7
Author: grilix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-08 13:09:33

Usted podría comprobar hacia fuera TouchTime.

Https://github.com/jheising/TouchTime .

Es un port directo de la impresionante función strtotime en PHP en 5.4 para Cocoa e iOS. Tomará prácticamente cualquier formato arbitrario de cadena de fecha u hora y lo convertirá en una NSDate.

Espero que funcione, y disfrutar!

 2
Author: Jim Heising,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-10 07:59:31

Hizo una extensión NSString 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 no está seguro (o simplemente no le importa) sobre el formato de fecha contenido en la cadena, use NSDataDetector para analizar la fecha.

//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; }];
 2
Author: Geri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-16 14:14:31

Como se respondió anteriormente, eso es lo que sucede cuando se inventa un nuevo sytax.

Basado en Apple NSDateFormatter Class Reference documentation

Hay muchos atributos que puede obtener y establecer en una fecha de estilo formatter ,... Sin embargo, se le recomienda que no cambie la configuración individual. En su lugar, debe aceptar la configuración predeterminada establecida en la inicialización y especificar el formato utilizando setDateStyle:, setTimeStyle:

Esto es especialmente importante para la salida, que es diferente para cada configuración regional. De forma predeterminada, NSDateFormatter observa la configuración regional del usuario actual. Así que la misma fecha 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 २२-११-२०११ ६:३३:१९ अपराह्, todo para la misma entrada y con el mismo código.

Considere por ejemplo este 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];

Compruebe los documentos de Apple para los diferentes estilos de NSDateFormatterStyle o este excelente tutorial

 -1
Author: Carlos Barcelona,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-09 13:24:00