Comment puis-je obtenir le temps GMT?
NSDate *c =[NSDate date];
7 Réponses :
Nsdate stocke le fuseau horaire à l'intérieur - il y a quelques fonctions que vous pouvez appeler et transmettre un fuseau horaire cible si vous voulez une représentation à chaîne de la date, voir Documentation d'Apple P>
Voir: P>
CFTimeConecreatewithTimeIntervalfromgmt SECONDESFROMGMT P>
- (NSDate*) convertToUTC:(NSDate*)sourceDate { NSTimeZone* currentTimeZone = [NSTimeZone localTimeZone]; NSTimeZone* utcTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; NSInteger currentGMTOffset = [currentTimeZone secondsFromGMTForDate:sourceDate]; NSInteger gmtOffset = [utcTimeZone secondsFromGMTForDate:sourceDate]; NSTimeInterval gmtInterval = gmtOffset - currentGMTOffset; NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:gmtInterval sinceDate:sourceDate] autorelease]; return destinationDate; }
-1 Ce Nsdate code> à
Nsdate code> La conversion est trompeur et basée sur une idée fausse de ce que représente un objet
nsdate code>.
@Dave Delong, je suis d'accord que j'accepte que tenter de convertir des objets Nsdate code> entre TimeZones est absurde et je ne comprends pas pourquoi cette autre réponse a tant de upvotes: Stackoverflow.com/ Questions / 1081647 / ...
Cette réponse est juste fausse. Les objets Nsdate représentent un seul instant dans le temps. Ils ne se soucient de rien du fuseau horaire. Le fuseau horaire ne passe en jeu que lorsque vous êtes en train de formater et d'afficher la date. La modification de l'objet NSDate signifie que vous modifiez le point à temps qu'il représente.
@Nickforge, quelle est la solution correcte pour convertir le temps de périphérique en temps GMT? D'autres réponses sont calculées à la chaîne, mais je veux une date GMT non un tigramme GMT (comme dans la réponse suivante NSString * GmtdateString = [DateFormatter StringFromdate: MyDate];)
@chatur Lire le commentaire de Sumbocket ci-dessus.
Et si l'heure du périphérique est de 2 heures de retard. En cette cas, ce calcul sera correct ???
Disponible en Mavericks: - (Nsdatecomonents *) ComposantsImezzone: (NSTZONONE *) Timezone DateDate: (NSDate *) Date
Si cela est à l'affichage, vous souhaitez l'afficher, utilisez NsdateFormatter comme SO:
NSDate *myDate = [NSDate date]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]]; // Set date style: [dateFormatter setDateStyle:NSDateFormatterShortStyle]; [dateFormatter setTimeStyle:NSDateFormatterShortStyle]; NSString *GMTDateString = [dateFormatter stringFromDate: myDate];
Et si l'heure du périphérique est de 2 heures de retard. En cette cas, ce calcul sera correct ???
Comment sauriez-vous si l'appareil est 2 heures de retard? Vous ne pouvez travailler que avec ce que vous avez donné et vous devez compter sur le temps du système pour être correct pour tout cas. C'est le travail du système, pas votre application.
Nous devons envisager tous les scénarios, mon scénario est que je souhaite obtenir le temps GMT indépendant du temps de périphérique. . . Y a-t-il une autre façon d'y parvenir?
Je pense que vous devrez appeler des API pour obtenir l'heure GMT actuelle, de sorte que vous obtiendrez un temps correct quel que soit le périphérique utilisé.
Ceci est une version plus simple de la réponse de Ramin
+ (NSDate *) GMTNow { NSDate *sourceDate = [NSDate date]; NSTimeZone* currentTimeZone = [NSTimeZone localTimeZone]; NSInteger currentGMTOffset = [currentTimeZone secondsFromGMT]; [sourceDate addTimeInterval:currentGMTOffset]; return sourceDate; }
C'est faux cependant. Si je suis à NY CurrentGMOffset, sera -14400. Depuis que GMT est plus tard que NYC, je souhaite ajouter une valeur positive à l'origine. Aussi à la source n'a pas été modifiée ici. Vous avez besoin de sources de source = [Sourcedate AddtimeInterval: CurrentGmToffset * -1]; qui inverse le signe du décalage.
Et si l'heure du périphérique est de 2 heures de retard. En cette cas, ce calcul sera correct ???
+ (NSDate*) convertToGMT:(NSDate*)sourceDate { NSTimeZone* currentTimeZone = [NSTimeZone localTimeZone]; NSTimeInterval gmtInterval = [currentTimeZone secondsFromGMTForDate:sourceDate]; NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:gmtInterval sinceDate:sourceDate] autorelease]; return destinationDate; }
C'est en fait une très bonne méthode utilitaire. Je vais l'utiliser dans mon projet actuel. Cependant, cela ne répond pas vraiment à la question. La question était "Comment puis-je obtenir l'heure du GMT?"
Si des calculs de date d'exécution, ces catégories peuvent être utiles. Après avoir converti votre rendez-vous pour être «normalisé» (c'est-à-dire d'avoir le même mois, le même jour et l'année, mais à +1200 UTC), si vous effectuez ensuite des calculs ultérieurs à l'aide d'un NSCalendar qui est également défini sur UTC ( + [ Nscalendar NormalizedCalendar] Code>), il va tous travailler.