para - Analizar formatos de fecha no admitidos en NSDate de via Cocoa
iso 8601 (4)
Si solo necesita manejar el formato ISO 8601 (del cual esa cadena es un ejemplo), puede probar mi analizador y analizador ISO 8601 .
Con el marco de Cocoa, ¿cómo puedo analizar @ "2008-12-29T00: 27: 42-08: 00" en un objeto NSDate? El estándar -dateWithString:
no le gusta.
En realidad, necesita establecer la zona horaria, el calendario y la configuración regional. Si no establece la configuración regional, un usuario tiene habilitada la hora AM / PM, el formateador agregará el marcador AM / PM. Si no configura la zona horaria, usará la zona horaria actual, pero la marcará como "Z" ("Zulu" o GMT). Si no establece el calendario, los usuarios con calendario imperial japonés tendrán el número de años desde la ascensión actual del Emperador en lugar de la cantidad de años desde que nació Jesucristo. ¡Asegúrate de probar en todos los escenarios que mencioné!
NSDateFormatter * f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"yyyy-MM-dd''T''HH:mm:ss''Z''"];
f.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
f.calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
f.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];
NSString * str = [f stringFromDate:someDate];
NSDate * date = [f dateFromString:dateStr];
Puede usar NSDateFormatter para analizar las fechas:
NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"yyyy-MM-dd''T''HH:mm:ssZ"];
date = [dateFormatter dateFromString:dateStr];
Los patrones de formato de fecha Unicode definen la cadena de formato que puede usar con el método setDateFormat:
.
Tenga en cuenta que si tiene como objetivo 10.4, debe llamar a [dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];
. No es necesario para iPhone o Leopard, ya que este modo es el predeterminado allí.
La forma en que se establece la zona horaria cambió de ios 5 a ios 6. iOS 6 admite el formato +01: 00 usando ZZZZZ pero ios 5 no. Resolví este problema con esta solución que me ayudó a analizar una fecha con el siguiente formato en ios 5 y 6.
2013-05-07T00: 00: 00 + 01: 00
NSMutableString *newDate = [date mutableCopy];
NSRange range;
range.location = 22;
range.length = 1;
[newDate replaceCharactersInRange:range withString:@""];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd''T''HH:mm:ssZZ"];
NSDate *dateFromString = [[NSDate alloc] init];
dateFromString = [dateFormatter dateFromString:newDate];