2011-04-13 12 views

Respuesta

23
NSDate *sourceDate = [NSDate dateWithTimeIntervalSinceNow:3600 * 24 * 60]; 
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone]; 
float timeZoneOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate]/3600.0; 
NSLog(@"sourceDate=%@ timeZoneOffset=%d", sourceDate, timeZoneOffset); 
+4

Hay dos posibles problemas con este código: (1) realmente debería usar "localTimeZone" en lugar de "systemTimeZone" (que normalmente termina siendo el mismo). (2) sourceDate debería ser [NSDate date], me encontré con un problema donde timeZoneOffset estaba equivocado por una hora al usar la fecha dada fuera del día. ¿Puedes explicar por qué usas una fecha de origen diferente por día? –

59

Hay un objeto NSTimeZone muy agradable que le dará el desplazamiento de GMT en el segundo huso horario:

float timezoneoffset = ([[NSTimeZone systemTimeZone] secondsFromGMT]/3600.0); 

Para más información, véase entrada de blog

http://blog.indieiphonedev.com/2011/01/09/getting-the-timezone-on-the-device/

+7

Recuerde que la compensación no es necesariamente un entero - algunos los países tienen compensaciones de media (o cuarto) hora (veo que la publicación lo menciona, es solo en caso de que las personas no puedan leerlo). –

+2

Solo quería agregar que este código evita algunos riesgos potenciales de la respuesta marcada como correcta. –

+1

El enlace a la publicación del blog en respuesta está muerto. – Pang

7

no hacer usa un int !!! Copié este código y ahora tengo un error en mi aplicación. Algunas zonas horarias son .5 horas

Utilice:

float offset = [timezone secondsFromGMTForDate:self.date]/3600.0; 

y no se olvide el 0,0 detrás 3600

15

Para aquellos que buscan la corriente desplazamiento de zona horaria como una cadena, tratan:

NSDateFormatter *localTimeZoneFormatter = [NSDateFormatter new]; 
localTimeZoneFormatter.timeZone = [NSTimeZone localTimeZone]; 
localTimeZoneFormatter.dateFormat = @"Z"; 
NSString *localTimeZoneOffset = [localTimeZoneFormatter stringFromDate:[NSDate date]]; 

En mi zona horaria, localTimeZoneOffset contiene -0700

+2

Gracias. Ahorré mis horas. –

1
-(void)getDeviceUTCOffset{ 

    NSDate *date = [NSDate date]; 
    NSTimeZone* deviceTimeZone_ = [NSTimeZone systemTimeZone]; 
    float offset = [deviceTimeZone_ secondsFromGMTForDate:date]/3600.0; 
} 

Para probar el código - de prueba en un dispositivo

dispositivo de cambio de zona horaria en

Settings > General > Date Time 
Turn off SET AUTOMATICALLY 
Then tap TimeZone and choose major cities east/west of you 
Run code and check float offset 

comparar el valor a las ciudades en este sitio

por ejemplo, heres Helsinki

Hora estándar: UTC/GMT +2 horas - como del NoV

http://www.timeanddate.com/worldclock/city.html?n=101

Comprobar contra los países con el horario de verano británico o su equivalente.

3

de Uso NSTimeZone localTimeZon e

NSTimeZone *timeZone = [NSTimeZone localTimeZone]; 
NSInteger seconds = [timeZone secondsFromGMT]; 
NSLog(@"TZ : %@ : Seconds %ld",[timeZone abbreviation],(long)seconds); 

int h = (int)seconds/3600; 
int m = (int)seconds/60 % 60; 

NSString *strGMT = @""; 
if (h>=0) 
    strGMT = [NSString stringWithFormat:@"+%02d:%02d", h, m]; 
else 
    strGMT = [NSString stringWithFormat:@"%03d:%02d", h, m]; 

NSLog(@"GMT -/+ HH:mm: %@",strGMT); 
+0

El código anterior no produce valores correctos para los segundos negativos deGMT y los minutos que no son cero. Sugeriría reemplazar la condición con 'if (0 <= segundos)' y la declaración 'else' con' strGMT = [NSString stringWithFormat: @ "-% 02d:% 02d", -h, -m]; ' –

0

Aquí está una manera fácil de hacer esto en Swift 3:

let offsetInHours = Double(TimeZone.current.secondsFromGMT())/3600.0

Cuestiones relacionadas