from current ios swift date time

ios - current - Fecha a milisegundos y hasta la fecha en Swift.



swift date format (5)

Como funciona la solución @Travis pero en algunos casos

var millisecondsSince1970:Int .

con error

El valor doble no se puede convertir a Int porque el resultado sería mayor que Int.max si se produce Actualice su respuesta con Int64

Aquí está la respuesta actualizada

extension Date { var millisecondsSince1970:Int64 { return Int64((self.timeIntervalSince1970 * 1000.0).rounded()) //RESOLVED CRASH HERE } init(milliseconds:Int) { self = Date(timeIntervalSince1970: TimeInterval(milliseconds / 1000)) } }

Espero que sea útil para alguien que también tiene el mismo problema.

Acerca de las definiciones de int.

En plataformas de 32 bits, Int es del mismo tamaño que Int32, y en plataformas de 64 bits, Int tiene el mismo tamaño que Int64.

En general, encuentro este problema en el iPhone 5 , que se ejecuta en env de 32 bits. Los nuevos dispositivos ejecutan env de 64 bits ahora. Su Int será Int64 .

Estoy tomando la hora actual, en UTC, y poniéndola en nanaosegundos y luego necesito tomar los nanosegundos y volver a una fecha en hora local. Puedo hacer llegar el tiempo a nanosegundos y luego volver a una cadena de fecha, pero el tiempo se complica cuando paso de una cadena a la fecha.

//Date to milliseconds func currentTimeInMiliseconds() -> Int! { let currentDate = NSDate() let dateFormatter = DateFormatter() dateFormatter.dateFormat = format dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone! let date = dateFormatter.date(from: dateFormatter.string(from: currentDate as Date)) let nowDouble = date!.timeIntervalSince1970 return Int(nowDouble*1000) } //Milliseconds to date extension Int { func dateFromMilliseconds(format:String) -> Date { let date : NSDate! = NSDate(timeIntervalSince1970:Double(self) / 1000.0) let dateFormatter = DateFormatter() dateFormatter.dateFormat = format dateFormatter.timeZone = TimeZone.current let timeStamp = dateFormatter.string(from: date as Date) let formatter = DateFormatter() formatter.dateFormat = format return ( formatter.date( from: timeStamp ) )! } }

// La marca de tiempo es correcta pero la fecha devuelta no es


La solución @Travis tiene razón, pero pierde milisegundos cuando se genera una Fecha. He añadido una línea para incluir los milisegundos en la fecha:

Si no necesita esta precisión, use la solución Travis porque será más rápida.

extension Date { func toMillis() -> Int64! { return Int64(self.timeIntervalSince1970 * 1000) } init(millis: Int64) { self = Date(timeIntervalSince1970: TimeInterval(millis / 1000)) self.addTimeInterval(TimeInterval(Double(millis % 1000) / 1000 )) } }


No entiendo por qué haces algo con cuerdas ...

extension Date { var millisecondsSince1970:Int { return Int((self.timeIntervalSince1970 * 1000.0).rounded()) } init(milliseconds:Int) { self = Date(timeIntervalSince1970: TimeInterval(milliseconds) / 1000) } } Date().millisecondsSince1970 // 1476889390939 Date(milliseconds: 0) // "Dec 31, 1969, 4:00 PM" (PDT variant of 1970 UTC)


//Date to milliseconds func currentTimeInMiliseconds() -> Int { let currentDate = Date() let since1970 = currentDate.timeIntervalSince1970 return Int(since1970 * 1000) } //Milliseconds to date extension Int { func dateFromMilliseconds() -> Date { return Date(timeIntervalSince1970: TimeInterval(self)/1000) } }

¡Eliminé la conversión aparentemente inútil a través de cadenas y todas esas aleatorias ! .


let dateTimeStamp = NSDate(timeIntervalSince1970:Double(currentTimeInMiliseconds())/1000) //UTC time //YOUR currentTimeInMiliseconds METHOD let dateFormatter = NSDateFormatter() dateFormatter.timeZone = NSTimeZone.localTimeZone() dateFormatter.dateFormat = "yyyy-MM-dd" dateFormatter.dateStyle = NSDateFormatterStyle.FullStyle dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle let strDateSelect = dateFormatter.stringFromDate(dateTimeStamp) print("Local Time", strDateSelect) //Local time let dateFormatter2 = NSDateFormatter() dateFormatter2.timeZone = NSTimeZone(name: "UTC") as NSTimeZone! dateFormatter2.dateFormat = "yyyy-MM-dd" let date3 = dateFormatter.dateFromString(strDateSelect) print("DATE",date3)