2017-10-02 17 views
0

Contexte
J'ai besoin de convertir la chaîne de temps avec le format suivant: « HH: mm » UTC à fuseau horaire local. Par exemple, si l'heure UTC est 09:00, l'heure locale (Stockholm/Europe) devrait être deux heures d'avance.Convertir UTC à fuseau horaire local donne un résultat erroné

Problème
Quand je convertir 09:00 (UTC) à l'heure de Stockholm/Europe je reçois 10:00. Il devrait être 11h00.

func UTCToLocal(date:String) -> String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "HH:mm" 
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC") 

    let dt = dateFormatter.date(from: date) 
    dateFormatter.timeZone = TimeZone.current //Stockholm/Europe 

    return dateFormatter.string(from: dt!) 
} 

print(UTCToLocal(date: "09:00")) //prints 10:00 

Pourquoi le fuseau horaire est-il différent de ce qu'il est censé être?

+0

Imprimer 'dt'. Mettez à jour votre question avec sa sortie. Très probablement c'est une vieille date qui cause votre problème. – rmaddy

+1

Sans rapport, mais pourquoi définir le 'dateFormat' deux fois au même format? Et pourquoi utiliser l'interpolation de chaîne sur 'date'? Faites juste 'let dt = dateFormatter.date (from: date)' – rmaddy

Répondre

3

Vous avez spécifié une seule heure, mais pas de jour. Par conséquent, "09:00" est converti à la date "2000-01-01 09:00:00 +0000". À ce moment, l'heure d'été n'était pas active à Stockholm, et l'heure locale était 10h00.

Si vous voulez que la conversion pour la journée en cours, vous pouvez définir

dateFormatter.defaultDate = Date() 
+0

Cela a fonctionné! Je ne peux pas vous remercier assez! – rilar