Convertir UTC en heure locale avec NSDateFormatter
Je suis à la chaîne suivante à partir d'un serveur dans mon application iOS:
20140621-061250
Comment puis-je convertir à l'heure locale?
Comment puis-je définir ma date de formateur? Est-ce correct?
dateFormatter.dateFormat = @"YYYYMMd-HHmmss";
essayez à partir du lien : stackoverflow.com/questions/1268509/...
Convertir un NSTimeInterval, que convertir un NSDate, utilisez NSDateFormatter pour générer la chaîne dans le fuseau horaire local.
NSTimeInterval semble accepter un double. Je suis de retour à la chaîne je le mentionne dans la question. Est-ce une chaîne valide? Je vous demande de vérifier si le serveur renvoie une problématique résultat...
Qu'entendez-vous par "convertir en heure locale'? Avez-vous besoin de la corde dans le même format, mais s'adapter au décalage horaire? NSDate a pas de concept de zone de temps.
J'ai confondu la chaîne pour un timestamp UNIX, qui est de secondes depuis "l'époque". simpleBob (apparemment) bien compris que c'est juste une compacté date, et facilement analysée avec la date exacte de formatage de chaîne de caractères.
Convertir un NSTimeInterval, que convertir un NSDate, utilisez NSDateFormatter pour générer la chaîne dans le fuseau horaire local.
NSTimeInterval semble accepter un double. Je suis de retour à la chaîne je le mentionne dans la question. Est-ce une chaîne valide? Je vous demande de vérifier si le serveur renvoie une problématique résultat...
Qu'entendez-vous par "convertir en heure locale'? Avez-vous besoin de la corde dans le même format, mais s'adapter au décalage horaire? NSDate a pas de concept de zone de temps.
J'ai confondu la chaîne pour un timestamp UNIX, qui est de secondes depuis "l'époque". simpleBob (apparemment) bien compris que c'est juste une compacté date, et facilement analysée avec la date exacte de formatage de chaîne de caractères.
OriginalL'auteur cateof | 2014-05-09
Vous devez vous connecter pour publier un commentaire.
La question ne précise pas la nature de ce que tu veux dire par la conversion, exactement, mais la première chose que vous devriez faire, quel que soit le but final est d'analyser correctement la réponse du serveur à l'aide d'une configuré correctement
NSDateFormatter
. Cela nécessite la spécification correcte de la chaîne de format, et le fuseau horaire doit être définie explicitement sur le formateur ou il va en déduire à partir de l'heure locale, ce qui serait incorrect dans la plupart des cas.Spécifier La Chaîne De Format
Regardons la chaîne d'entrée prévue:
Il utilise quatre chiffres pour l'année, deux chiffres (avec un zéro-padding) pour le mois et deux chiffres (vraisemblablement, il sera complété par des zéros) pour la journée. Ceci est suivi par une
-
, puis deux chiffres pour représenter l'heure, 2 chiffres pour les minutes, et 2 chiffres pour le deuxième.Se référant à la Unicode normes de format de date, nous pouvons déduire la chaîne de format de la manière suivante. Les quatre chiffres représentant l'année civile sera remplacé par
yyyy
dans la chaîne de format. UtilisationMM
pour le mois, etdd
pour la journée. Ensuite viendront le littéral-
. Pour les heures, je suppose que ce sera dans le format de 24 heures sinon cette réponse est ambiguë, nous utilisons donc desHH
. Procès-verbaux sont ensuitemm
et secondesss
. La concaténation des spécificateurs de format obtient ainsi la chaîne de format, nous allons utiliser dans l'étape suivante:Dans notre programme, cela ressemblerait à:
Configurer la date d'entrée formateur
Le format de l'heure ci-dessus ne permet pas de spécifier un fuseau horaire, mais parce que vous avez été fournie à la spécification de la réponse du serveur qu'il représente à l'heure UTC, nous pouvons coder ce dans notre application. Donc, nous instancions un
NSDateFormatter
, définissez le fuseau horaire correct, et définir le format de date:Convertir la chaîne d'entrée à un
NSDate
Pour les besoins de la démonstration, nous coder en dur la chaîne que vous avez reçu de la réponse du serveur; vous devez remplacer cette définition de
inputString
avec celui que vous obtenez à partir du serveur:À ce point, nous avons l'objet nécessaire pour effectuer les autres conversions ou des calculs - un
NSDate
qui représente le temps communiquées par le serveur. Rappelez-vous, uneNSDate
est juste un timbre de temps - il n'a aucun rapport avec un fuseau horaire que ce soit, qui ne joue qu'un rôle lors de la conversion vers et à partir de représentations de chaîne de la date, ou des représentations d'un calendrier jour viaNSDateComponents
.Prochaines étapes
La question n'est pas clairement spécifier de quel type de conversion n'est nécessaire, donc, nous allons voir un exemple de formatage de la date à afficher dans le même format que la réponse du serveur (bien que, je ne peux pas penser à une probable cas d'utilisation de ce bout de code, pour être honnête). Les étapes sont tout à fait semblables - nous spécifier une chaîne de format, d'un fuseau horaire, configurer une date de formateur, puis de générer une chaîne de caractères (dans le format spécifié) à partir de la date:
Depuis que je suis à l'UTC-06:00, l'impression
outputString
donne les éléments suivants:Il est probable que vous voulez plutôt utiliser
setDateStyle:
etsetTimeStyle:
au lieu d'une chaîne de format si vous êtes l'affichage de cette date à l'utilisateur, ou l'utilisation d'unNSCalendar
pour obtenir unNSDateComponents
exemple de faire des opérations ou des calculs sur la date. Un exemple pour l'affichage d'une verbose chaîne de date pour l'utilisateur:Impression
outputString
ici nous donne les éléments suivants:Noter que le réglage du fuseau horaire de façon appropriée permettra de gérer les transitions plus de l'heure d'été. La modification de la chaîne d'entrée à "20141121-061250" avec le formateur de code de style ci-dessus nous donne la date suivante pour afficher (Notez que l'Heure normale des rocheuses est UTC-7):
Sommaire
Chaque fois que vous obtenez la date d'entrée en une chaîne de caractères représentant une date du calendrier et de l'heure, votre première étape est de le convertir en utilisant un
NSDateFormatter
configuré pour l'entrée du format, fuseau horaire, et éventuellement des paramètres régionaux et de calendrier, selon la source de l'entrée et de vos exigences. Cela donnera unNSDate
qui est sans contredit la représentation d'un moment dans le temps. À la suite de la création de cetteNSDate
, on peut le format, le style, ou de le convertir à jour les composants nécessaires pour les exigences de votre application.Merci!!!! Si la question a été modifiée de façon à indiquer ce que vous cherchiez à faire après avoir analysé le serveur de la date, je pourrais peut-être développer sur les "prochaines étapes", si vous avez besoin de plus de conseils.
Je m en passant la chaîne, comme le 12/5/2014 9:11:51 AM et de sortie pour mon heure locale de simulateur est 12/22/2013 02:41:51 PM. Comment cela est possible. L'heure du serveur est en UTC.
Vraiment super réponse. Je vais l'utiliser.
OriginalL'auteur Carl Veazey
Pour obtenir votre chaîne en NSDate, vous devez utiliser une NSDateFormatter comme ceci:
Vous voudrez peut-être lire ce post sur de travail avec la Date et l'Heure
EDIT:
Il parse que l'UTC, vous devez ajouter la ligne:
Aussi, lorsque vous imprimez avec NSLog, si vous utilisez le même NSDateFormatter, vous obtiendrez la chaîne d'entrée comme de sortie (puisque vous appliquer l'inverse de la fonction d'analyse syntaxique).
Voici le code complet, de l'analyse et pour l'obtention de la sortie avec un format standard:
n'a pas fonctionné. Après l'ajout de la ligne NSString * = [df stringFromDate:madate]; et l'impression avec NSLog, la chaîne locale renvoyé une copie in extenso de 20140621-061250.
Probablement, vous êtes à l'aide de la même formateur pour la conversion de la chaîne en date, que pour la conversion de retour à partir de la date à la chaîne. C'est pourquoi votre sortie ressemble à l'entrée. (Voir mon edit)
OriginalL'auteur Daniel
Une solution possible dans Swift à l'aide de NSDate extension (peut-être que ça pourrait aider les futurs spectateurs de cette question):
func dateComponents(in timeZone: TimeZone, from date: Date) -> DateComponents
ou de l'utilisation DateFormatter et changement de fuseau horaire pour afficher l'heure UTCOriginalL'auteur King-Wizard