2010-12-17 16 views
10

Consulte los códigos y resultados a continuación.NSDateFormatter + dateFormatFromTemplate: options: locale: BUG?

NSDateComponents *dateComponents = [[[NSDateComponents alloc] init] autorelease]; 
[dateComponents setYear:2011]; 
[dateComponents setMonth:1]; 
[dateComponents setDay:1]; 

NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:dateComponents]; 

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateFormat:[NSDateFormatter dateFormatFromTemplate:@"YYYYMMMd" options:0 locale:[NSLocale currentLocale]]]; 

NSString *dateString = [dateFormatter stringFromDate:date]; 

NSLog(@"Happy New Year: %@", dateString); 

¿Qué esperas para la salida?

Happy New Year: Jan 1, 2011 

Pero el resultado es ...

Happy New Year: Jan 1, 2010 

¿Qué ocurre? Por favor, ayuda ...

Respuesta

16

La cadena de formato de la plantilla debe ser @"yyyyMMMd" (minúscula "y" para el año).

Mayúscula "Y" es otra cosa (ver Unicode Date Format Patterns).

+4

+1 Específicamente, Y es el año de la semana actual. La semana del 1 de enero de 2011 pertenece a 2010, por lo que YYYY produce el 2010. – ughoavgfhw

+0

Muchas gracias ~ – alforo

+0

@ughoavgfhw: Gracias. Debería haber señalado la diferencia en la respuesta porque puede ser confusa ya que "Y" parece "funcionar" la mayor parte del tiempo. La letra mayúscula "Y" le dice en qué año comienza la semana que contiene su fecha. Entonces, si el 1 de enero es un jueves, "Y" dará el año del * inicio * de esa semana (es decir, el lunes). Para el 7 de enero o más tarde, "Y" dará el mismo resultado que "Y" pero, por supuesto, es mejor usar la letra de formato correcta en primer lugar. – Anna