NSDate solo representa un punto absoluto en el tiempo . No tiene ningún concepto de zona horaria o calendario. ¡Cuando creas una instancia de NSDate es solo un número de segundos desde el 1 de enero de 2001 GMT! No importa si estás en Nueva York, Tokio, Barcelona o Jerusalén.
En su ejemplo, instancia el NSDate basado en GMT, pero [date description]
(utilizado en NSLog
) lo traduce a su hora local. Ahí tienes el desajuste.
Así que hay dos partes a considerar:
1. creación NSDate usando NSCalendar y NSTimeZone
Si está creando una fecha manualmente se debe especificar el calendario (gregoriano en 2012, pero 5772, en hebreo) y zona horaria (22PM hora de Londres, pero 7 AM hora de Sydney).
// Use the user's current calendar and time zone
NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setTimeZone: [NSTimeZone systemTimeZone]];
// Specify the date components manually (year, month, day, hour, minutes, etc.)
NSDateComponents *timeZoneComps=[[NSDateComponents alloc] init];
[timeZoneComps setHour:22];
[timeZoneComps setMinute:0];
[timeZoneComps setSecond:0];
// ... year, month, ...
// transform the date compoments into a date, based on current calendar settings
NSDate *date = [calendar dateFromComponents:timeZoneComps];
En este punto tiendas fecha el punto exacto en el tiempo (en segundos) que representa el calendario actual.
2. Salida de NSDate usando NSDateFormatter
Para una salida controlada de su NSDate necesita NSDateFormatter, que se utiliza para convertir las fechas en cadenas.
Sobre la base de la documentación de Apple NSDateFormatter Class Reference
Hay muchos atributos que se pueden obtener y establecer una fecha estilo formateador, ... se le anima sin embargo, no cambiar los ajustes, individuales . En su lugar debe aceptar los ajustes por defecto establecidos en la inicialización y especificar el formato de usando setDateStyle :, setTimeStyle:
Esto es especialmente importante para la salida, que es diferente para cada configuración regional. Por defecto, NSDateFormatter observa la configuración regional actual del usuario. Entonces, el mismo NSDate podría ser 22.11.2011 18:33:19
, o Nov 22, 2011 6:33:19 PM
, o 2011-11-22 下午6:33:19
o incluso २२-११-२०११ ६:३३:१९ अपराह्
, todos para la misma entrada y con el mismo código.
Y el código:
// NSDate *date -> NSString *dateString
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
// Medium style date, short style time => "Nov 23, 1937 3:30pm"
NSString *dateString = [dateFormatter stringFromDate:date];
O usted podría transformarla mediante el método de la clase localizedStringFromDate:dateStyle:timeStyle:
Espero que esto aclare el problema.
try \t [df setLocale: [NSLocale currentLocale]]; –