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!)