Comment convertir la date de réponse du server en timezone local?

Dans la réponse d'appel d'api j'obtiens des dates dans le timezone différent. Je veux le convertir au timezone local de l'user plus l'user peut choisir n'importe quel timezone de la list du timezone d'ios. Tout est local. Nous n'enverrions jamais de timezone d'user sélectionné au server.

Et tout en faisant un appel api permet de dire que je crée un événement avec la date de début sélectionnée dans un sélecteur. Je devrais l'envoyer timezone global pas avec le timezone choisi par l'user parce qu'il est local à l'application.

Actuellement, je suis en train de changer defaultTimeZone sur la sélection afin que je reçoive la bonne date actuelle, etc. Et en utilisant NSDateFormatter avec setTimeZone … [NSTimeZone timeZoneWithName …

Est-ce une meilleure approche pour changer defaultTimeZone qui est tous locaux à l'application? Comment dois-je convertir le NSdate à la date globale tout en l'envoyant au server?

NSDate est un moment dans le time, vous pourriez l'appeler time absolu. Ce time est le même pour tous les endroits sur terre. NSDate ne représente pas une heure formatée selon les goûts des personnes à un location spécifique. Cette différenciation est très importante.

Un seul NSDate () peut avoir plusieurs représentations dans plusieurs fuseaux horaires.

Pour le rendre plus visuel, ces 5 horloges représentent toutes un seul point dans le time (l'instance NSDate ):

entrez la description de l'image ici

Ils montrent juste une représentation différente du même point dans le time.

On pourrait dire que ces horloges sont ce que NSDateFormatter.ssortingngFromDate() est. Ils transforment le moment absolu en une représentation locale.

Pour convertir entre différents fuseaux horaires vous ne modifiez pas NSDate , vous changez le timezone de NSDateFormatter . Si la string de date que vous obtenez de votre server est en UTC, vous avez besoin d'un NSDateFormatter qui utilise UTC comme timeZone:

 let utcDateFormatter = NSDateFormatter() utcDateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) utcDateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") utcDateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" let serverSsortingng = "2015-04-03 12:34:56" // date from server, as date representation in UTC let date = utcDateFormatter.dateFromSsortingng(serverSsortingng) // date you got from server, as point in time 

Pour afficher l'heure de ce server à votre user, vous prenez ce NSDate et le placez dans une autre dateFormatter:

 // display absolute time from server as timezone aware ssortingng let localDateFormatter = NSDateFormatter() localDateFormatter.dateStyle = NSDateFormatterStyle.LongStyle localDateFormatter.timeStyle = NSDateFormatterStyle.LongStyle let localDateSsortingng = localDateFormatter.ssortingngFromDate(date) 

Et si vous voulez renvoyer une string de date à votre server, vous prenez un NSDate et le mettez dans votre dateFormatter UTC.

 // send back time to server let dateSsortingng = utcDateFormatter.ssortingngFromDate(NSDate())