2016-12-04 2 views
3

En essayant de convertir "2016-06-23 12:00:00" à une date UTC je reçois "2016-06-23 10:00:00"Confusion lors de la conversion de la date de GMT + 1 à UTC dans Swift

La première date est en GMT + 1 que je veux convertir en UTC. Si je ne me trompe pas GMT + 0 == UTC alors 12:00 devrait être 11:00 non? Mais je reçois toujours 10h00. Pourquoi est-ce le cas et comment puis-je le convertir correctement?

moi avons tous deux essayé cela dans la cour de récréation et sur un périphérique réel

Ce code je:

class ViewController: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    let datestring:String = "2016-06-23 12:00:00" 

    print("1: "+datestring) 

    print("2: "+convertDateToUTC(datestring)) 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func convertDateToUTC(_ datestring:String) -> String { 

    let dateForm = DateFormatter() 
    dateForm.dateFormat = "yyyy-MM-dd HH:mm:ss" 
    dateForm.timeZone = TimeZone(abbreviation: "GMT+1") 

    print(TimeZone.current.abbreviation()!) 

    let date = dateForm.date(from: datestring) 

    dateForm.timeZone = TimeZone(abbreviation: "UTC") 

    let date1 = dateForm.string(from: date!) 

    return date1 

} 

} 

sortie:

1: 2016-06-23 12:00:00 
GMT+1 
2: 2016-06-23 10:00:00 

Répondre

4

Réponse courte: Remplacer "GMT+1" par "GMT+01".

"GMT+1" n'est pas une abréviation de fuseau horaire valide:

let tz = TimeZone(abbreviation: "GMT+1") 
print(tz) // nil 

Par conséquent,

dateForm.timeZone = TimeZone(abbreviation: "GMT+1") 

vous définissez dateForm.timeZone-nil, ce qui signifie que la chaîne date est interprétée dans votre défaut (local) fuseau horaire.

Avec

dateForm.timeZone = TimeZone(abbreviation: "GMT+01") 

vous obtiendrez le résultat escompté. Vous pouvez également créer le fuseau horaire du (numérique) GMT offset ou de son identifiant:

dateForm.timeZone = TimeZone(secondsFromGMT: 3600) 
dateForm.timeZone = TimeZone(identifier: "GMT+0100") 

Addendum (en réponse à vos commentaires):

TimeZone(identifier: "GMT+0100") 
TimeZone(identifier: "Europe/Berlin") 

sont différents fuseaux horaires. Le premier utilise un décalage GMT fixe d'une heure, le second est le fuseau horaire d'une région (dans ce cas, l'Allemagne), et diffère de l'heure UTC d'une ou deux heures, selon que l'heure d'été est active à la date spécifiée.

+0

Merci, ça a bien marché! Ce qui me dérange est que TimeZone.current.abbreviation()! me donne GMT + 1 et pas GMT + 01 ... Quand je mets maintenant TimeZone (abréviation: TimeZone.current.abbreviation()!) cela ne fonctionnera pas encore, que dois-je faire? – abcdefg

+0

Aha. :))))))))) Je pense que nous devrions aussi lui conseiller de regarder ce que le fuseau horaire est plutôt que de simplement faire une supposition. – matt

+2

@abcdefg Il est préférable de ne jamais créer de fuseau horaire à partir d'une abréviation de fuseau horaire. Comme vous l'avez vu, cela ne fonctionne pas toujours. De plus, il existe des abréviations en double et beaucoup d'invalides. Utilisez toujours les initialiseurs 'identifier' ou' secondsFromGMT' pour éviter ces problèmes. – rmaddy