2010-04-05 5 views
3

je le code suivant dans une application de production qui calcule une date GMT à partir de la date à laquelle l'utilisateur entre:NSDate - GMT sur iPhone

NSDate *localDate = pickedDate; 
    NSTimeInterval timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT]; // You could also use the systemTimeZone method 
    NSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] - timeZoneOffset; 
    NSDate *gmtDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval]; 

Le code fonctionnait très bien, jusqu'au moment de l'heure d'été redoutée est entré en force au Royaume-Uni la semaine dernière.

Comment convertir la date en heure GMT tout en tenant compte de l'heure d'été?

Répondre

6

NSDate utilise un décalage d'une valeur absolue pour représenter les intervalles de temps. La base est en GMT et tous les intervalles de temps sont en GMT, c'est pourquoi vous voyez la différence. Si vous voulez une représentation sous forme de chaîne de votre date (comme pour le stockage dans une base de données ou autre), utilisez NSDateFormatter pour le créer dans le fuseau horaire spécifique dont vous avez besoin.

Alors, ce sera toujours vous donner une représentation de chaîne (comme pour le stockage dans une base MySQL) de la date à GMT (avec épargne temps de Daylights ont représenté):

NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease]; 
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; // e.g., set for mysql date strings 
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]]; 
NSString* mysqlGMTString = [formatter stringFromDate:[NSDate date]]; 

Cela vous donnera la chaîne de date correcte en heure GMT indépendamment du fuseau horaire local. Aussi, gardez à l'esprit que toutes les mesures relatives que vous faites avec NSDate et les intervalles de temps ont leur base en GMT. Utilisez les formateurs de date et les objets de calendrier pour les convertir en éléments plus significatifs lorsque vous les présentez à l'utilisateur ou si vous devez effectuer des calculs de calendrier (par exemple, en affichant un avertissement indiquant que votre abonnement expire demain).

EDIT: J'ai oublié d'ajouter le fuseau horaire! Sans cela, le formateur utilisera le fuseau horaire du système.

+1

Vous pouvez convertir en NSDate en utilisant NSDateFormatter ainsi: http://stackoverflow.com/questions/1578577/nsdateformatter-datefromstring-will-not-parse-a-particular-date-string/1586083#1586083 –

+0

@ Epsilon Prime: eh bien oui, mais il demandait spécifiquement de travailler avec des dates et des fuseaux horaires, pas forcément des ficelles. J'ai choisi cet exemple parce que c'est une raison courante que les gens veulent convertir d'un fuseau horaire local à une autre base (comme GMT). –