NSDateFormatter muestra el año incorrecto

Resuelto Simon asked hace 12 años • 1 respuestas

Estoy usando xcode 4.5 (4G182) con iOS 6. NSDateFormatter muestra un año incorrecto en iOS 6, ¿cómo solucionarlo?

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"YYYY-MM-dd"];
NSString *str = [dateFormatter stringFromDate:[NSDate date]];
NSLog(@"%@ == %@",str,[[dateFormatter dateFromString:str] description]);

imprime " 2012 -09-14 == 2011 -09-13 16:00:00 +0000"

Simon avatar Sep 14 '12 18:09 Simon
Aceptado

YYYYno es lo mismo que yyyy.

Según esta página a la que hace referencia la página de formato de fecha de iOS ;

`y`: Year
`Y`: Year (in "Week of Year" based calendars). This year designation is used in 
     ISO year-week calendar as defined by ISO 8601, but can be used in 
     non-Gregorian based calendar systems where week date processing is desired. 
     May not always be the same value as calendar year.

Siendo la sentencia resolutiva la última. Úselo yyyyen su lugar.


Más detalles sobre cómo y por qué los valores del año pueden desviarse al usar YYYY:

El año de numeración de semanas ISO comienza el primer día (lunes) de la semana 01 y termina el domingo anterior al nuevo año ISO (por lo tanto, sin superposición ni espacio). Consta de 52 o 53 semanas completas . El número de año de numeración de semanas ISO se desvía del número del año calendario gregoriano tradicional en un viernes, sábado y domingo, o un sábado y domingo, o simplemente un domingo, al comienzo del año calendario gregoriano tradicional (que están en al final del año anterior de numeración de semanas ISO) y un lunes, martes y miércoles, o un lunes y martes, o simplemente un lunes, al final del año calendario gregoriano tradicional (que están en la semana 01 de la siguiente semana ISO -año de numeración). Para los jueves, el número de año de numeración de semanas ISO siempre es igual al número de año del calendario gregoriano tradicional.

Ejemplos:

Lunes 29 de diciembre de 2008 se escribe " 2009 -W01-1"

Domingo 3 de enero de 2010 se escribe " 2009 -W53-7"

De https://en.wikipedia.org/wiki/ISO_8601#Week_dates (se agregó estilo en negrita)

Joachim Isaksson avatar Sep 14 '2012 11:09 Joachim Isaksson