iPhone NSDateFormatter Conversión de Zona horaria


Estoy intentando crear un formateador que convierta el formato de fecha mostrado en un objeto NSDate:

NSString *dateStr = @"2010-06-21T19:00:00-05:00";
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];
NSDate *date = [dateFormat dateFromString:dateStr];  

El problema es la zona horaria -05:00, que no se analiza correctamente con el formato anterior. Alguna sugerencia?

Author: iOS Developer Tips, 2010-06-22

6 answers

Honestamente, solo tendrá que cambiar los datos de origen (eliminando los dos puntos) antes de ejecutarlos a través del formateador. Su cadena de fecha original no es estándar y ninguna de las cadenas de formato de zona horaria funcionará correctamente en ella.

Puede ver las entradas válidas en unicode.org .

ZZZ e. g."-0500"

ZZZZ por ejemplo "GMT-05: 00"

Nada para "-05: 00"

 30
Author: chrissr,
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-06-22 19:32:58

Para procesar la zona horaria con dos puntos en ella, solo necesita usar 5 'Z. Este es un formato de fecha bastante común, el formato ISO-8601. Esto solo funcionará en iOS 6.x +

-(NSDate *) dateFromString:(NSString *)string {

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"];

    return [formatter dateFromString:string];
}
 63
Author: brynbodayle,
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-10-23 14:48:18

Puede que me haya perdido algo, pero ZZ funcionó para mí. He utilizado:

@"yyyy-MM-dd'T'HH:mm:ss.SSSZZ"

Para

2014-02-27T08:00:00.000+04:00
 2
Author: DanSkeel,
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-03-07 11:16:47

Este es el formato de tiempo predeterminado que obtuve de un backend de Sinatra ActiveRecord. Aquí está mi solución.

-(NSDate *) dateFromString:(NSString *)string{
    NSMutableString * correctedDateString = [[NSMutableString alloc] initWithString:string];
    [correctedDateString deleteCharactersInRange: NSMakeRange(22, 1)];

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];

    return [formatter dateFromString:correctedDateString];
}
 1
Author: Logan,
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-11-29 14:44:36

Esta es la única solución que funcionó para mí:

[dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"];
 1
Author: Dave Cole,
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
2015-05-19 23:18:57

5 ZZZZZ-heres una categoría que escribí con alguna muestra de GMT a BST

Https://github.com/clearbrian/NSDateFormatter_ISO_8601

 0
Author: brian.clear,
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-03-04 13:18:53