Obtenez de l'heure UTC et l'heure locale de l'objet NSDate
En objective-c, le code ci-dessous dans la date de l'heure UTC de l'information en temps à l'aide de la date
API.
NSDate *currentUTCDate = [NSDate date]
Dans Swift cependant,
let date = NSDate.date()
résultats dans les locaux de la date et de l'heure.
J'ai deux questions:
- Comment puis-je obtenir de l'heure UTC et l'heure locale (bien
date
donne l'heure locale) dansNSDate
objets. - Comment puis-je obtenir la précision pour les secondes à partir de la
NSDate
objet.
EDIT 1: Merci pour toutes les entrées, mais je ne suis pas à la recherche pour NSDateFormatter
des objets ou des valeurs de chaîne. Je suis simplement à la recherche pour NSDate objets (cependant nous les faire cuire, mais c'est l'exigence).
Voir le point 1.
NSDate
donne un sous-précision de seconde.- Un
NSDate
est un moment dans le temps. Il n'y a pas une telle chose comme un UTC date ou à une date locale. C'est juste une question de comment vous l'afficher. - NSDate instances sont fondées sur l'intervalle de temps depuis le premier instant du 1er janvier 2001, à l'heure GMT. Ainsi, la zone de temps qu'une date est créé à ne pas faire toute la différence et n'affecte pas la
NSDate
valeur. - À partir de l'Apple Docs: "La seule méthode primitive de NSDate, timeIntervalSinceReferenceDate, fournit la base pour toutes les autres méthodes dans le NSDate interface. Cette méthode retourne une valeur de temps par rapport à une référence absolue de la date—le premier instant du 1er janvier 2001, GMT."
Vous devez vous connecter pour publier un commentaire.
La documentation dit que le
date
méthode retourne une nouvelle date à la date actuelle et l'heure quel que soit le langage utilisé.Le problème se trouve probablement quelque part où vous présente la date à l'aide de
NSDateFormatter
.NSDate
est juste un point sur une ligne du temps. Il n'y a pas de zones de temps lorsque l'on parle deNSDate
. J'ai fait un test.Swift
De sortie:
2014-07-23 17:56:45 +0000
Objective-C
De sortie:
2014-07-23 17:58:15 +0000
Résultat - Pas de différence.
let x = NSDate.date()
.description
de laNSDate
objet affichera local de fuseau horaire sur votre appareil dans le journal, mais toutes les dates sont au format GMT ou UTC dans la réalité. Les paramètres affiche le journal de la date fixée pour le fuseau horaire où vous vous trouvez. Ce qui est correct. Si je n'étais pas à GMT permet de dire (GMT +1 heure), puis la date de montrer2014-07-23 16:56:45 +0000
(GMT ou UTC) dans le journal, après je l'ai créé. En réalité, c'est2014-07-23 17:56:45 +0000
(mon fuseau horaire local). Imaginez, ils sont stockés dans GTM ou de l'UTC et de changer en fonction de votre fuseau horaire.2014-07-23 16:56:45 +0000
, la date du jour est en fait2014-07-23 17:56:45 +0100
, le+0100
représente le décalage entre l'heure UTC.NSDate
est un point spécifique dans le temps sans un fuseau horaire. Il pense que le nombre de secondes écoulées depuis une date de référence. Combien de secondes se sont écoulées dans un fuseau horaire contre l'autre, car une référence particulière à la date prévue? La réponse est la même.Selon la façon dont vous sortie cette date (y compris en regardant le débogueur), vous pouvez obtenir une réponse dans un autre fuseau horaire.
Si ils ont couru au même moment, les valeurs de ces sont les mêmes. Ils sont à la fois le nombre de secondes depuis la date de référence, qui peut être formaté sur la sortie à l'UTC ou heure locale. Au sein de la variable de date, ils sont à la fois UTC.
Objective-C:
Swift:
Pour expliquer cela, on peut utiliser un NSDateFormatter dans une aire de jeux:
La date sortie varie, mais la date est constante. C'est exactement ce que vous dites. Il n'y a pas une telle chose comme un local NSDate.
Comme pour comment obtenir des microsecondes, vous pouvez l'utiliser (le mettre au fond de la même aire de jeux):
Pour comparer deux dates, vous pouvez utiliser
date.compare(otherDate)
.po
pour l'afficher pendant le débogage (ou tout simplement utiliser NSLog), ce sera toujours indiqués en UTC.NSDate
type. Est-il un moyen de le faire.NSFormatter
ne permettent pas de résoudre n'importe quel but.dateA.compare(dateB);
NSDate
. Comparer les deuxNSDate
; il fera ce que vous voulez. Je suggère la lecture de ce qui, de nouveau, car il semble que vous êtes encore à côté de la question. 🙂+0000
et de toujours garder les secondes?Xcode 9 • Swift 4 (fonctionne également Swift 3.x)
Aire de jeux de tests
Ce qui pourrait vous aider aussi mise en forme de vos dates:
une date est indépendant de n'importe quel fuseau horaire, donc à utiliser un Dateformatter et joindre un fuseau horaire pour afficher:
swift:
objC:
Ce code donne la date au format UTC. Si vous avez besoin de l'heure locale, vous devez appeler l'extension suivante avec le fuseau horaire, comme
Timezone.current
Pour l'heure UTC, l'utiliser comme:
Date().currentUTCTimeZoneDate
En ce moment (avec les dernières modifications apportées à Swift),
NSDate.date()
n'est plus disponible.Au lieu de cela, vous avez juste besoin d'initialiser
NSDate
et il obtient la date et l'heure actuelles.Pour l'essayer, dans une aire de jeux:
et vous obtiendrez:
Swift 3
Vous pouvez obtenir la Date en fonction de votre fuseau horaire UTC
Appeler comme ceci:
Mon Xcode Version 6.1.1 (6A2008a)
Dans l'aire de jeux, test comme ceci:
J'ai trouvé un moyen plus facile d'obtenir de l'UTC, dans Swift4. Placer ce code dans la cour
En plus d'autres réponses, vous pouvez écrire une extension de la Date de classe pour obtenir des Données au format spécifique de Fuseau horaire pour rendre la fonction d'utilité pour une utilisation future. Comme
Maintenant, vous pouvez l'appeler comme