52 votes

NSDate - Convertir la date en GMT

J'ai besoin de la capacité de convertir une valeur NSDate en date GMT.

Comment puis - je aller à la conversion d' un NSDate de la valeur à un GMT format NSDate valeur, indépendamment des paramètres quel que soit l'iPhone locale la date est utilisée?

134voto

Howard Points 951
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm";

    NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    [dateFormatter setTimeZone:gmt];
    NSString *timeStamp = [dateFormatter stringFromDate:[NSDate date]];
    [dateFormatter release];

42voto

Alex Points 19842

De travail avec le temps dans le Cacao peut être compliqué. Lorsque vous obtenez une NSDate objet, c'est dans le fuseau horaire local. [[NSTimeZone defaultTimeZone] secondsFromGMT] vous donne le décalage du fuseau horaire de GMT. Ensuite, vous pouvez faire ceci:

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

Maintenant, gmtDate devrait avoir la date correcte en GMT pour vous. Pour l'afficher, regardez - NSDateFormatter, plus précisément de l' setDateStyle et setTimeStyle méthodes. Vous créez un NSDateFormatter, le configurer de la manière que vous voulez, et ensuite appeler stringFromDate: pour obtenir un bien mis en forme de chaîne.

16voto

Akusete Points 4597

Howard Réponse est correcte et s'il vous plaît voter et accepter.

Pour référence, je pense qu'il est utile d'expliquer la différence entre les objets date et localisée date de représentations.

Dans de nombreux langages de programmation date d'objets sont utilisés pour représenter des points uniques dans le temps. Ignorant les Relativistes et les arguments qu'il peut être supposé que, en tout cas nous pouvons définir un point dans le temps qui est égal universellement pour tous, indépendamment de la façon dont nous mesurons le temps.

Si pour chaque point dans le temps, nous avons pu construire un label unique, ce label pourrait être passé autour et référencé sans ambiguïté. Le but de la date d'objets est d'agir comme une unique étiquette universelle pour un point donné dans le temps.

On pourrait arriver à n'importe quel nombre de techniques pour construire un tel système d'étiquetage et comment chaque objet date choisit de le faire, est indifférente à toute personne les utilisant.

Un exemple peut être d'utiliser un numérique, offset à partir d'un universel de l'événement (X secondes depuis que le soleil a explosé).

C'est seulement lorsque nous voulons prendre un moment et de le sérialiser dans un lisible par l'homme de chaîne que nous devons faire face à la complexité des fuseaux horaires, les lieux, etc...

(Date Locale De La Chaîne) + (Date De Formateur) => Point De Temps

Point De Temps + (Date De Formateur) => (Locale Chaîne De Date)

Chaque point dans le temps est universel... il n'y a pas une telle chose comme une heure de new york point, ou gmt point de temps, seulement une fois que vous convertir un point dans le temps à une chaîne locale (à l'aide d'une date de formateur) toute association à une zone de temps apparaissent.

Note: je suis sûr qu'il ya beaucoup de blogs/articles sur cette question, mais mon google foo est de ne pas en moi, à cette heure. Si quelqu'un a de l'enthousiasme à développer sur cette question s'il vous plaît sentir libre de le faire.

5voto

thevoid Points 314

Tandis qu'Alex réponse était un bon début, il ne s'occupe pas de l'heure d'été (heure d'été) et ajouté une conversion inutile à/à partir de la date de référence. Le suivant fonctionne pour moi:

Pour convertir à partir d'un localDate GMT, la prise en compte de l'heure d'été:

NSDate *localDate = <<your local date>>
NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone] secondsFromGMTForDate:localDate];
NSDate *gmtDate = [localDate dateByAddingTimeInterval:-timeZoneOffset]; // NOTE the "-" sign!

Pour convertir une date GMT à une localDate, la prise en compte de l'heure d'été:

NSDate *gmtDate  = <<your gmt date>>
NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone] secondsFromGMTForDate:gmtDate];
NSDate *localDate = [gmtDate dateByAddingTimeInterval:timeZoneOffset];

Une petite remarque: j'ai utilisé dateByAddingTimeInterval, qui est l'iOS 4. Si vous êtes sur OS 3 ou une version antérieure, utilisez addTimerInterval.

3voto

Jasarien Points 35353

Avez-vous essayé de regarder la documentation pour NSDateFormatter?

NSDateFormatter

NSDateFormatter semble avoir quelques méthodes pour jouer avec les fuseaux horaires, en particulier

-setTimeZone:

Je n'ai pas testé moi-même, mais j'imagine que si vous définissez le fuseau horaire GMT à une date qui est à l'origine, représenté dans un autre fuseau horaire, il affiche la date, avec les modifications nécessaires afin de correspondre au nouveau fuseau horaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X