Diferencia entre 'AAAA' y 'aaaa' en NSDateFormatter
¿Cuál es la diferencia exacta entre 'AAAA' y 'aaaa'? Leí en este enlace que dice que
Un error común es utilizar AAAA. yyyy especifica el año calendario, mientras que AAAA especifica el año (de "Semana del año"), utilizado en el calendario ISO año-semana. En la mayoría de los casos, yyyy y YYYY dan el mismo número, aunque pueden ser diferentes. Normalmente debería utilizar el año calendario.
Pero cuando trato de usar
NSString *stringDate = @"Feb 28, 2013 05:30pm";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MMM dd, yyyy hh:mma"];
NSDate *date=[dateFormatter dateFromString:stringDate];
NSLog(@"Date 1 : %@",date); //2013-02-28 12:00:00 +0000
NSString *stringDatee = @"Feb 28, 2013 05:30pm";
NSDateFormatter *dateFormatterr = [[NSDateFormatter alloc] init];
[dateFormatterr setDateFormat:@"MMM dd, YYYY hh:mma"];
NSDate *datee=[dateFormatterr dateFromString:stringDatee];
NSLog(@"Date 2 : %@",datee); //2013-01-05 12:00:00 +0000
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MMM dd, YYYY hh:mma"];
NSString *dateString = [dateFormat stringFromDate:datee];
NSLog(@"date 3 : %@", dateString); //Jan 05, 2013 05:30PM
Como aquí, el resultado es date
diferente datee
, lo cual entendí, pero ¿por qué el resultado de la fecha 2 y la fecha 3 son diferentes? Mientras estoy creando una fecha a partir de una cadena y volviendo a invertir la misma en la cadena, ¿pero la salida no coincide?
¿Alguien sabe la razón sobre lo mismo? Aunque especifica la semana del año, debería obtener el mismo resultado.
Gracias..
EDITAR :-
Si codifico
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MMM dd, YYYY hh:mma"];
NSString *dateString = [dateFormatterr stringFromDate:[NSDate date]];
NSLog(@"date: %@", dateString); //Feb 28, 2013 04:37PM
Si el resultado es el correcto, pero lo paso como cadena hasta la fecha, obtengo 2013-01-05 12:00:00 +0000
, verifique la fecha 2 de NSLog, resultado extraño, ¿por qué?
Además, cuando se utiliza una cadena con formato de fecha, es importante utilizar el formato correcto.
@"AAAA" es un año calendario semanal.
@"yyyy" es el año calendario ordinario.
Puedes revisar el blog completo, es bueno echarle un vistazo.
https://web.archive.org/web/20150423093107/http://realmacsoftware.com/blog/working-with-date-and-time
http://realmacsoftware.com/blog/working-with-date-and-time (enlace inactivo)
Un error común es utilizar AAAA. yyyy especifica el año calendario, mientras que AAAA especifica el año (de "Semana del año"), utilizado en el calendario ISO año-semana. En la mayoría de los casos, yyyy y YYYY dan el mismo número, aunque pueden ser diferentes. Normalmente debería utilizar el año calendario.
de Documentos de Apple
dd/MMM/YYYY - e.g.:1 01/Jan/2000; answer : 19/dec/1999
(see weekly calendar December month last Monday
suppose leaf year + 1 day)
dd/MMM/yyyy - eg: ordinary - no problem.
Todas las respuestas son diferenciadoras yyyy
y YYYY
son respuestas correctas para otra pregunta. La pregunta en sí se refiere a otra cosa.
¿Por qué estos dos valores son diferentes? (extraído de la pregunta)
NSLog(@"Date 2 : %@",datee); //2013-01-05 12:00:00 +0000
NSLog(@"Date 3 : %@", dateString); //Jan 05, 2013 05:30PM
La respuesta aquí @PJ es que en realidad no tienen un valor diferente. Cuando registra una NSDate (que es la Fecha 2), obtiene la descripción completa de su objeto que se encuentra en la zona horaria UTC . Esta lógica no ocurre al registrar la Fecha 3 porque ya se convirtió en una Cadena y se aplicó su zona horaria.
Para imprimir la Fecha 3 "de la misma manera" que obtiene la Fecha 2. Debe especificar la zona horaria UTC para la Fecha 3. Algo como esto:
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MMM dd, YYYY hh:mma"];
[dateFormat setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
NSString *dateString = [dateFormat stringFromDate:datee];
NSLog(@"date 3 : %@", dateString);
Espero que esto ayude.
tl;dr la zona horaria