2011-04-13 3 views

Répondre

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

Il y a deux problèmes potentiels avec ce code: (1) il devrait vraiment utiliser "localTimeZone" au lieu de "systemTimeZone" (qui normalement se termine par être le même). (2) sourceDate devrait être [date NSDate], j'ai rencontré un problème où le timeZoneOffset était erroné d'une heure lors de l'utilisation de la date d'expiration donnée. Pouvez-vous expliquer pourquoi vous utilisez une date source différente d'un jour? –

59

Il y a un très bel objet NSTimeZone qui vous donnera le décalage horaire de GMT en quelques secondes:

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

Pour plus voir blog Le post

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

+7

Rappelez-vous que le décalage est pas nécessairement un entier - certains les pays ont des décalages d'une demi-heure (ou quart) (je vois que le post le mentionne, c'est juste au cas où les gens ne le liraient pas). –

+2

Je voulais juste ajouter que ce code évite certains pièges potentiels de la réponse marquée comme correcte. –

+1

Lien vers l'article de blog en réponse est mort. – Pang

7

Ne pas utilise un int !!! J'ai copié ce code et j'ai maintenant un bug dans mon application. Certains sont timezones .5 heures

utiliser ceci:

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

et ne pas oublier le .0 derrière 3600

15

Pour ceux qui cherchent la zone heure de décalage en tant que chaîne, essayez:

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

Dans mon fuseau horaire, localTimeZoneOffset contient -0700

+2

Merci. Enregistré mes heures. –

1
-(void)getDeviceUTCOffset{ 

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

Pour tester le code - test sur un dispositif

dispositif de changement dans Timezone

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 

Comparer la valeur aux villes sur ce site

par exemple Heres Helsinki

fuseau horaire standard: UTC/GMT +2 heures - à partir de Nov

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

contre les pays avec Check heure d'été britannique ou leur équivalent.

3

localTimeZon Utiliser NSTimeZone 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

Le code ci-dessus ne produit pas de valeurs correctes pour les secondes négativesFromGMT et les minutes non nulles. Je suggère de remplacer la condition par 'if (0 <= secondes)' et l'instruction 'else' par' strGMT = [NSString stringWithFormat: @ "-% 02d:% 02d", -h, -m]; ' –

0

est ici un moyen facile de le faire en Swift 3:

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

Questions connexes