ios swift date timezone nsdate

ios - Conversión de formato de fecha UTC a nsdate local



swift timezone (7)

Estoy obteniendo de mi servidor una fecha de cadena en la zona horaria UTC y necesito convertirla a la zona horaria local.

MI CÓDIGO:

let utcTime = "2015-04-01T11:42:00.269Z" let dateFormatter = NSDateFormatter() dateFormatter.timeZone = NSTimeZone(name: "UTC") dateFormatter.dateFormat = "yyyy-MM-dd''T''HH:mm:ss.SSS''Z''" let date = dateFormatter.dateFromString(utcTime) println("utc: /(utcTime), date: /(date)")

esto imprime -

utc: 2015-04-01T11: 42: 00.269Z, fecha: Opcional (2015-04-01 11:42:00 +0000)

si elimino

dateFormatter.timeZone = NSTimeZone(name: "UTC")

imprime

utc: 2015-04-01T11: 42: 00.269Z, fecha: Opcional (2015-04-01 08:42:00 +0000)

mi zona horaria local es UTC +3 y en la primera opción obtengo UTC en la segunda opción obtengo UTC -3

Debería obtener

utc: 2015-04-01T11: 42: 00.269Z, fecha: Opcional (2015-04-01 14:42:00 +0000)

Entonces, ¿cómo convierto el formato de fecha UTC a la hora local?


Algo similar me funcionó en Objective-C:

// create dateFormatter with UTC time format NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd''T''HH:mm:ss"]; [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; NSDate *date = [dateFormatter dateFromString:@"2015-04-01T11:42:00"]; // create date from string // change to a readable time format and change to local time zone [dateFormatter setDateFormat:@"EEE, MMM d, yyyy - h:mm a"]; [dateFormatter setTimeZone:[NSTimeZone localTimeZone]]; NSString *timestamp = [dateFormatter stringFromDate:date];

Guardo estos dos sitios web útiles para convertir diferentes formatos de tiempo: http://www.w3.org/TR/NOTE-datetime

http://benscheirman.com/2010/06/dealing-with-dates-time-zones-in-objective-c/

En Swift será:

// create dateFormatter with UTC time format let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd''T''HH:mm:ss" dateFormatter.timeZone = NSTimeZone(name: "UTC") let date = dateFormatter.dateFromString("2015-04-01T11:42:00")// create date from string // change to a readable time format and change to local time zone dateFormatter.dateFormat = "EEE, MMM d, yyyy - h:mm a" dateFormatter.timeZone = NSTimeZone.localTimeZone() let timeStamp = dateFormatter.stringFromDate(date!)


Ampliando lo que otros han mencionado, aquí hay una práctica extensión de NSDate en Swift

import Foundation extension NSDate { func ToLocalStringWithFormat(dateFormat: String) -> String { // change to a readable time format and change to local time zone let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = dateFormat dateFormatter.timeZone = NSTimeZone.localTimeZone() let timeStamp = dateFormatter.stringFromDate(self) return timeStamp } }


En Swift 3 esto funciona bien:

// create dateFormatter with UTC time format let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd''T''HH:mm:ss" dateFormatter.timeZone = TimeZone(abbreviation: "UTC") let date = dateFormatter.date(from: "2015-04-01T11:42:00")// create date from string // change to a readable time format and change to local time zone dateFormatter.dateFormat = "EEE, MMM d, yyyy - h:mm a" dateFormatter.timeZone = TimeZone.current let timeStamp = dateFormatter.string(from: date!)


Prueba esta extensión Swift

Swift 4 : UTC / GMT ⟺ Local (Actual / Sistema)

extension Date { // Convert local time to UTC (or GMT) func toGlobalTime() -> Date { let timezone = TimeZone.current let seconds = -TimeInterval(timezone.secondsFromGMT(for: self)) return Date(timeInterval: seconds, since: self) } // Convert UTC (or GMT) to local time func toLocalTime() -> Date { let timezone = TimeZone.current let seconds = TimeInterval(timezone.secondsFromGMT(for: self)) return Date(timeInterval: seconds, since: self) } } // Try it let utcDate = Date().toGlobalTime() let localDate = utcDate.toLocalTime() print("utcDate - (utcDate)") print("localDate - (localDate)")


Tal vez puedas probar algo como:

extension NSDate { convenience init(utcDate:String, dateFormat:String="yyyy-MM-dd HH:mm:ss.SSS+00:00") { // 2016-06-06 00:24:21.164493+00:00 let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = dateFormat dateFormatter.timeZone = NSTimeZone(name: "UTC") let date = dateFormatter.dateFromString(utcDate)! let s = NSTimeZone.localTimeZone().secondsFromGMTForDate(date) let timeInterval = NSTimeInterval(s) self.init(timeInterval: timeInterval, sinceDate:date) } }


Tuve que eliminar tanto z como mili segundos de la solución c_rath. Funciona a gran velocidad 4.

extension String { func fromUTCToLocalDateTime() -> String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd''T''HH:mm:ss" dateFormatter.timeZone = TimeZone(abbreviation: "UTC") var formattedString = self.replacingOccurrences(of: "Z", with: "") if let lowerBound = formattedString.range(of: ".")?.lowerBound { formattedString = "/(formattedString[..<lowerBound])" } guard let date = dateFormatter.date(from: formattedString) else { return self } dateFormatter.dateFormat = "EEE, MMM d, yyyy - h:mm a" dateFormatter.timeZone = TimeZone.current return dateFormatter.string(from: date) } }


Versión rápida de la respuesta c_rath:

// create dateFormatter with UTC time format let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd''T''HH:mm:ss" dateFormatter.timeZone = NSTimeZone(name: "UTC") let date = dateFormatter.dateFromString("2015-04-01T11:42:00") // change to a readable time format and change to local time zone dateFormatter.dateFormat = "EEE, MMM d, yyyy - h:mm a" dateFormatter.timeZone = NSTimeZone.localTimeZone() let timeStamp = dateFormatter.stringFromDate(date!)