reloj peru lima hora como colombia clima calcular analogico ahora actual swift nsdate nsdateformatter nsdatecomponents

peru - Swift 3.0: Convierte la hora UTC del servidor a la hora local y viceversa



hora utc colombia (5)

Con la ayuda de Mrugesh Tank Answer,

He actualizado su respuesta y creando las extensiones para la fecha. Para que pueda acceder fácilmente a las funciones desde cualquier lugar, ya sea desde ViewController o también desde la clase celular.

extension String { //MARK:- Convert UTC To Local Date by passing date formats value func UTCToLocal(incomingFormat: String, outGoingFormat: String) -> String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = incomingFormat dateFormatter.timeZone = TimeZone(abbreviation: "UTC") let dt = dateFormatter.date(from: self) dateFormatter.timeZone = TimeZone.current dateFormatter.dateFormat = outGoingFormat return dateFormatter.string(from: dt ?? Date()) } //MARK:- Convert Local To UTC Date by passing date formats value func localToUTC(incomingFormat: String, outGoingFormat: String) -> String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = incomingFormat dateFormatter.calendar = NSCalendar.current dateFormatter.timeZone = TimeZone.current let dt = dateFormatter.date(from: self) dateFormatter.timeZone = TimeZone(abbreviation: "UTC") dateFormatter.dateFormat = outGoingFormat return dateFormatter.string(from: dt ?? Date()) } }

Ejemplo de cómo usarlo: -

Note:- eventStartDate is the string which you have to converted in your format like this:- "2018-07-11T16:22:00.000Z" let finalDate = eventStartDate.UTCToLocal(incomingFormat: "yyyy-MM-dd''T''HH:mm:ss.SSSZ", outGoingFormat: "MMM d, yyyy h:mm a")

Quiero convertir la hora UTC del servidor a la hora local y viceversa. Aquí está mi código ...

var isTimeFromServer = true var time:String! var period:String! let timeString = "6:59 AM" //Current UTC time if isTimeFromServer { let index = timeString.index(timeString.startIndex, offsetBy: 5) let twelve = timeString.substring(to: index) var dateString:String! let dateFormatter = DateFormatter() dateFormatter.dateFormat = "H:mm" let date12 = dateFormatter.date(from: twelve)! dateFormatter.dateFormat = "h:mm a" let date22 = dateFormatter.string(from: date12) //print(date22) dateString = date22 //print("dateString=/(dateString)") time = dateString.components(separatedBy: " ")[0] period = dateString.components(separatedBy: " ")[1] } else { time = timeString.components(separatedBy: " ")[0] period = timeString.components(separatedBy: " ")[1] } var hour = Int(time.components(separatedBy: ":")[0]) hour = period == "AM" ? hour : hour! + 12 let minute = Int(time.components(separatedBy: ":")[1]) let calender = NSCalendar.current var datecomponent = DateComponents() datecomponent.calendar = calender datecomponent.hour = hour datecomponent.minute = minute if !isTimeFromServer { // local to UTC datecomponent.timeZone = TimeZone.current } else { datecomponent.timeZone = TimeZone(abbreviation: "UTC") } let date = datecomponent.date let dateFormatter = DateFormatter() if !isTimeFromServer { dateFormatter.dateFormat = "H:mm" dateFormatter.timeZone = TimeZone(abbreviation: "UTC") dateFormatter.string(from: date!) } else { //UTC to local dateFormatter.dateFormat = "h:mm a" dateFormatter.timeZone = TimeZone.current dateFormatter.string(from: date!) }

Me sale la hora local

o / p: "12:52 PM"

Pero la diferencia entre la hora local actual y la hora de salida es de 23 minutos.


La respuesta de Mrugesh es perfecta, pero si alguien necesita usar sus propios formatos, o en algún formato diferente, lo he generalizado para que pueda dar un formato diferente o igual en ambos parámetros.

func localToUTC(date:String, fromFormat: String, toFormat: String) -> String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = fromFormat dateFormatter.calendar = NSCalendar.current dateFormatter.timeZone = TimeZone.current dateFormatter.date let dt = dateFormatter.date(from: date) dateFormatter.timeZone = TimeZone(abbreviation: "UTC") dateFormatter.dateFormat = toFormat return dateFormatter.string(from: dt!) } func UTCToLocal(date:String, fromFormat: String, toFormat: String) -> String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = fromFormat dateFormatter.timeZone = TimeZone(abbreviation: "UTC") let dt = dateFormatter.date(from: date) dateFormatter.timeZone = TimeZone.current dateFormatter.dateFormat = toFormat return dateFormatter.string(from: dt!) } let localDateAsString = UTCToLocal(date: dateAsString!, fromFormat: "hh:mm a, dd MMM yyyy", toFormat: "hh:mm a, dd MMM yyyy")

Puedes usarlo como arriba. Espero eso ayude.


No sé qué está mal con tu código.
Pero parece que hay demasiadas cosas innecesarias, como si estuvieras configurando el calendario, recuperando algunos elementos de la cadena. Aquí está mi versión pequeña de la función UTCToLocal y localToUTC.
Pero para eso necesitas pasar una cadena en un formato específico. Porque he desempaquetado los objetos de fecha. Pero puedes usar algunas condiciones de guardia para evitar que tu aplicación se bloquee.

func localToUTC(date:String) -> String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "h:mm a" dateFormatter.calendar = NSCalendar.current dateFormatter.timeZone = TimeZone.current let dt = dateFormatter.date(from: date) dateFormatter.timeZone = TimeZone(abbreviation: "UTC") dateFormatter.dateFormat = "H:mm:ss" return dateFormatter.string(from: dt!) } func UTCToLocal(date:String) -> String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "H:mm:ss" dateFormatter.timeZone = TimeZone(abbreviation: "UTC") let dt = dateFormatter.date(from: date) dateFormatter.timeZone = TimeZone.current dateFormatter.dateFormat = "h:mm a" return dateFormatter.string(from: dt!) }

y llamar a estas funciones como a continuación.

print(UTCToLocal(date: "13:07:00")) print(localToUTC(date: "06:40 PM"))

Espero que esto te ayudará.
Feliz codificacion !!


Para todos los que usan objetos TimeZone. Le aconsejaría que cree su Zona horaria a partir de un identificador en lugar de una abreviatura cuando tenga la posibilidad.

Esto evita los errores causados ​​por el horario de verano.

Para ilustrar mi punto tomemos un ejemplo. Puede crear una instancia de esta manera, let timeZone = TimeZone(identifier: "Europe/Paris") o de esa manera let timeZone = TimeZone(abbreviation: "CEST") que let timeZone = TimeZone(abbreviation: "CEST") o "UTC +2: 00"

Pero esta es la zona horaria para el CEST de verano que significa el horario de verano de Europa Central Tenemos CET que significa el horario de Europa Central para el invierno que es "UTC +1: 00"

Puede administrar el horario de verano por su cuenta con Date.isDaylightSavingsTime, pero esto significa más código y no tiene control sobre el origen del horario de verano. "indica si el receptor está utilizando el horario de verano" del documento oficial

Todo lo que es es decir, favor de Zona horaria (identificador: ...)


Por favor pruebalo:

func convertUTCToLocal(timeString: String) -> String? { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "h:mm a" dateFormatter.timeZone = TimeZone.init(abbreviation: "UTC") let timeUTC = dateFormatter.date(from: timeString) if timeUTC != nil { dateFormatter.timeZone = NSTimeZone.local let localTime = dateFormatter.string(from: timeUTC!) return localTime } return nil } func convertLocalToUTC(localTime: String) -> String? { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "h:mm a" dateFormatter.timeZone = NSTimeZone.local let timeLocal = dateFormatter.date(from: localTime) if timeLocal != nil { dateFormatter.timeZone = TimeZone.init(abbreviation: "UTC") let timeUTC = dateFormatter.string(from: timeLocal!) return timeUTC } return nil } var isTimeFromServer = true var time:String! var period:String! let timeString = "6:59 AM" //Current UTC time if isTimeFromServer { print(convertUTCToLocal(timeString: timeString)) } else { print(convertLocalToUTC(localTime: timeString)) }