iOS NSDate () renvoie une heure incorrecte

J'essaie d'get la date actuelle dans Swift en utilisant NSDate() . Lorsque je crée un point d'arrêt et que j'arrête l'application, je constate qu'il y a une différence de 3 heures avec l'heure du système. L'application fonctionne sur un vrai iPhone. Comment régler ceci?

J'ai également écrit ce qui suit dans App Delegate pour être sûr:

 NSTimeZone.setDefaultTimeZone(NSTimeZone(name: "Europe/Kiev")!) 

Mais cela ne fonctionne toujours pas.

Il ne returnne pas le mauvais moment. Il returnne exactement le bon moment. NSDate n'a aucune information de timezone. À l'heure actuelle, mon ordinateur et votre ordinateur signaler exactement la même heure lorsque nous appelons NSDate ().

NSLog affiche NSDate en UTC. C'est juste ce qu'il affiche. Donc, si nous appelons tous les deux NSLog en ce moment, votre ordinateur savea la même date et heure que la mienne. Parce que c'est la même date et l'heure.

Si vous souhaitez traiter un NSDate (par exemple, pour afficher la date et l'heure à un user), vous utilisez un NSCalendar. Le NSCalendar traduit entre NSDate, qui est le même partout dans le monde, aux valeurs que vous voulez afficher dans votre interface user, ce qui sera différent à Londres ou à Kiev. Si je regarde ma montre en ce moment, je verrai une heure différente de celle que vous voyez sur votre montre, et c'est pour cela que NSCalendar est là.

Voici la conversion pour swift 3.0:

 func getCurrentLocalDate()-> Date { var now = Date() var nowComponents = DateComponents() let calendar = Calendar.current nowComponents.year = Calendar.current.component(.year, from: now) nowComponents.month = Calendar.current.component(.month, from: now) nowComponents.day = Calendar.current.component(.day, from: now) nowComponents.hour = Calendar.current.component(.hour, from: now) nowComponents.minute = Calendar.current.component(.minute, from: now) nowComponents.second = Calendar.current.component(.second, from: now) nowComponents.timeZone = TimeZone(abbreviation: "GMT")! now = calendar.date(from: nowComponents)! return now as Date } 

Pour Swift 2.2 cette fonction a fait l'affaire pour moi:

 func getCurrentLocalDate()-> NSDate { var now = NSDate() let nowComponents = NSDateComponents() let calendar = NSCalendar.currentCalendar() nowComponents.year = NSCalendar.currentCalendar().component(NSCalendarUnit.Year, fromDate: now) nowComponents.month = NSCalendar.currentCalendar().component(NSCalendarUnit.Month, fromDate: now) nowComponents.day = NSCalendar.currentCalendar().component(NSCalendarUnit.Day, fromDate: now) nowComponents.hour = NSCalendar.currentCalendar().component(NSCalendarUnit.Hour, fromDate: now) nowComponents.minute = NSCalendar.currentCalendar().component(NSCalendarUnit.Minute, fromDate: now) nowComponents.second = NSCalendar.currentCalendar().component(NSCalendarUnit.Second, fromDate: now) nowComponents.timeZone = NSTimeZone(abbreviation: "GMT") now = calendar.dateFromComponents(nowComponents)! return now } 

Si vous voulez un timezone différent, vous pouvez le changer directement, ou mieux encore, le passer comme paramètre de fonction.