2017-08-12 2 views
-1
import UIKit 
import Foundation 

let dateString = "2017-08-13T05:10:00Z" 
let dateFormatter = ISO8601DateFormatter() 

if var date = dateFormatter.date(from: dateString) { 
    if let newYorkTimeZone = TimeZone(abbreviation: "EDT") { 
     date.addTimeInterval(TimeInterval(newYorkTimeZone.secondsFromGMT(for: date))) 
     print("NY time:", date, date.hour()) 
    } 
} 

if var date = dateFormatter.date(from: dateString) { 
    if let chiTimeZone = TimeZone(abbreviation: "CDT") { 
     date.addTimeInterval(TimeInterval(chiTimeZone.secondsFromGMT(for: date))) 
     print("CHI time:", date, date.hour()) 
    } 
} 

if let gmt = TimeZone(abbreviation: "GMT") { 
    if var date = dateFormatter.date(from: dateString) { 
     print("GMT time:", date, date.hour()) 
    } 
} 

extension Date { 
    func hour() -> String { 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "h:mm a" 

     return dateFormatter.string(from: self) 
    } 
} 

sortie alors que mon système est réglé sur EDT:Pourquoi les temps sont-ils interprétés différemment selon les fuseaux horaires?

heure de New York: 13/08/2017 01:10:00 +0000 21:10

temps CHI: 2017 -08 à 13 00:10:00 +0000 20:10

heure GMT: 13/08/2017 05:10:00 +0000 01:10


sortie alors que mon système est réglé sur CDT:

heure de New York: 13/08/2017 01:10:00 +0000 20:10

CHI temps: 13/08/2017 00: 10:00 +0000 19:10

heure GMT: 13/08/2017 05:10:00 +0000 00:10


Si pas ces temps restent les mêmes, peu importe ce que fuseau horaire dans lequel je suis? Je n'utilise aucun élément lié à TimeZone.current.

Remarque: Je sais qu'il est préférable d'utiliser TimeZone.secondsFromGMT:, mais l'utilisation du paramètre d'abréviation facilite la lecture de ce qui se passe dans cette question.

+3

Votre code n'a aucun sens. Un objet de date Cocoa est un instant dans le temps partout sur la planète. Au moment où j'écris ceci, il est environ 13h00 HAE, et vers midi heure centrale. Pourquoi le même objet 'Date' apparaîtrait-il en même temps dans différents fuseaux horaires? –

+0

Vous devez utiliser un formateur de date défini sur le fuseau horaire souhaité pour exprimer cette date en heure locale. –

+0

La seule différence entre vos deux jeux de sortie est le résultat de l'appel à 'hour' et votre fonction' hour' est basée sur votre locale actuelle et votre fuseau horaire actuel. Alors, bien sûr, ces valeurs changent lorsque vous changez le fuseau horaire de votre système. – rmaddy

Répondre

0

Voici ma version de votre code à partir d'une aire de jeux.

import UIKit 

let dateString = "2017-08-13T05:10:00Z" 
let isoDateFormatter = ISO8601DateFormatter() 
guard let date = isoDateFormatter.date(from: dateString) else { assert(false) } 

let gmtDateFormatter = DateFormatter() 
gmtDateFormatter.timeZone = TimeZone(secondsFromGMT: 0)! 
gmtDateFormatter.dateStyle = .medium 
gmtDateFormatter.timeStyle = .medium 

let nyDateFormatter = DateFormatter() 
nyDateFormatter.timeZone = TimeZone(abbreviation: "EDT")! 
nyDateFormatter.dateStyle = .medium 
nyDateFormatter.timeStyle = .medium 

let chiDateFormatter = DateFormatter() 
chiDateFormatter.timeZone = TimeZone(abbreviation: "CDT")! 
chiDateFormatter.dateStyle = .medium 
chiDateFormatter.timeStyle = .medium 

let gmtDate = gmtDateFormatter.string(from: date) // -> Aug 13, 2017, 5:10:00 AM 
let nyDate = nyDateFormatter.string(from: date) // -> Aug 13, 2017, 1:10:00 AM 
let chiDate = chiDateFormatter.string(from: date) // -> Aug 13, 2017, 12:10:00 AM 

Une date est un point fixe dans le temps, elle n'a pas de fuseau horaire, ou l'heure d'été. Pour obtenir une représentation de chaîne d'une fois, utilisez un DateFormatter avec le fuseau horaire appliqué. Mon terrain de jeu est défini sur les paramètres régionaux US par défaut, mais je peux modifier l'un des paramètres régionaux des formateurs de date pour afficher différemment la date et l'heure.

Vous n'avez pas besoin d'ajouter des intervalles à la date que vous avez, vous avez juste besoin de formater sa sortie et c'est à cela que sert un DateFormatter.

+0

Ok, je comprends maintenant.Je devrais changer la façon dont la date présente w/'DateFormatter', ne pas essayer de modifier la' Date' elle-même. – erdos

0

Tenir compte de ce code:

let now = Date() 

let formatter = DateFormatter() 
formatter.dateStyle = .medium 
formatter.timeStyle = .medium 

func printDate(_ aDate: Date, inTimeZone timeZoneString: String? = nil) { 
    let timeZone: TimeZone! 
    if let timeZoneString = timeZoneString { 
    timeZone = TimeZone(abbreviation: timeZoneString) 
    guard timeZone != nil else { 
     print("invalid time zone string \(timeZoneString)") 
     return 
    } 
    } else { 
    timeZone = TimeZone.current 
    } 
    formatter.timeZone = timeZone 
    print("Date = \(formatter.string(from: now)) in time zone \(timeZone.abbreviation()!)") 
} 

printDate(now) 
printDate(now, inTimeZone: "CDT") 
printDate(now, inTimeZone: "GMT") 
printDate(now, inTimeZone: "NZST") 

Run en EDT: la sortie est:

Date = Aug 12, 2017, 1:17:13 PM in time zone EDT 
Date = Aug 12, 2017, 12:17:13 PM in time zone CDT 
Date = Aug 12, 2017, 5:17:13 PM in time zone GMT 
Date = Aug 13, 2017, 5:17:13 AM in time zone GMT+12