2011-09-20 19 views
14

Tengo un objeto NSDate. Digamos que representa "01/10/2011"Obtener NSDate de NSDate ajustado con la zona horaria

NSDate *date = [df dateFromString:@"2011-10-01 00:00:00"]; 

Esa fecha se traduce en "2011-09-30 22:00:00" a causa de mi zona horaria.

Pregunta: ¿Cómo obtengo un nuevo objeto Date que representa "2011-10-01 00:00:00" en mi zona horaria local?

+0

try \t [df setLocale: [NSLocale currentLocale]]; –

Respuesta

27

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.

6

[NSDate date] devuelve la fecha en GMT.

cuando dice:

Esa fecha se traduce en "2011-09-30 22:00:00" debido a mi zona horaria.

¿Es eso de NSLog o NSDateFormatter? No confíe en [date description] que utiliza NSLog, tiene en cuenta su zona horaria local, use NSDateFormatter. NSDateFormatter tiene un método setTimeZone.

a partir de documentos de Apple en [date description]:

La representación no se garantiza que permanecerá constante a través de comunicados de diferentes del sistema operativo. Para dar formato a una fecha, debe utilizar un objeto de fecha formateador lugar

Cuestiones relacionadas