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)