it-swarm.com.de

Datum in Millisekunden und zurück zu Datum in Swift

Ich nehme die aktuelle Zeit in UTC und stelle sie in Nanaosekunden ein. Dann muss ich die Nanosekunden nehmen und zu einem Datum in Ortszeit zurückkehren. Ich bin in der Lage, die Zeit auf Nanosekunden zu bringen und dann wieder auf eine Datumszeichenfolge zurückzugreifen, aber die Zeit wird verschlungen, wenn ich von einer Zeichenfolge zu Datum gehe.

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

// Der Zeitstempel ist korrekt, aber das zurückgegebene Datum ist nicht

28
user1079052

Ich verstehe nicht, warum Sie irgendetwas mit Saiten machen ...

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)
97
Travis Griggs

Als @Travis Solution funktioniert das aber in manchen Fällen 

var millisecondsSince1970:IntWILL ABBRUCH ANWENDUNG

mit fehler

Doppelter Wert kann nicht in Int konvertiert werden, da das Ergebnis größer als Int.max ist, wenn es auftritt. Aktualisieren Sie Ihre Antwort mit Int64

Hier ist aktualisierte Antwort 

extension Date {
 var millisecondsSince1970:Int64 {
        return Int64((self.timeIntervalSince1970 * 1000.0).rounded()) 
        //RESOLVED CRASH HERE
    }

    init(milliseconds:Int) {
        self = Date(timeIntervalSince1970: TimeInterval(milliseconds / 1000))
    }
}

Hoffe, es ist hilfreich für jemanden, der das gleiche Problem hat 


Über Int-Definitionen.

Auf 32-Bit-Plattformen hat Int die gleiche Größe wie Int32, und auf 64-Bit-Plattformen hat Int die gleiche Größe wie Int64.

Im Allgemeinen tritt dieses Problem in iPhone 5 auf, das in einer 32-Bit-Umgebung ausgeführt wird. Neue Geräte führen jetzt eine 64-Bit-Umgebung aus. Ihre Int wird Int64 sein.

27

@Travis-Lösung ist richtig, verliert jedoch Millisekunden, wenn ein Datum generiert wird. Ich habe eine Zeile hinzugefügt, um die Millisekunden in das Datum aufzunehmen:

Wenn Sie diese Präzision nicht benötigen, verwenden Sie die Travis-Lösung, da diese schneller ist.

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

}
8
//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)
    }
}

Ich habe scheinbar unbrauchbare Konvertierungen per String und all den zufälligen ! entfernt.

7
user28434
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)
2
MAhipal Singh

@Prashant Tukadiya Antwort funktioniert. Wenn Sie den Wert jedoch in UserDefaults speichern und dann mit einem anderen Datum vergleichen möchten, werden Sie von int64 abgeschnitten, sodass Probleme auftreten können. Ich habe eine Lösung gefunden.

Schnell 4:

Sie können Int64 als String in UserDefaults speichern:

let value: String(Date().millisecondsSince1970)
let stringValue = String(value)
UserDefaults.standard.set(stringValue, forKey: "int64String")

So vermeiden Sie eine Int-Verkürzung.

Und dann können Sie den ursprünglichen Wert wiederherstellen:

let int64String = UserDefaults.standard.string(forKey: "int64String")
let originalValue = Int64(int64String!)

Damit können Sie es mit anderen Datumswerten vergleichen:

let currentTime = Date().millisecondsSince1970
let int64String = UserDefaults.standard.string(forKey: "int64String")
let originalValue = Int64(int64String!) ?? 0 

if currentTime < originalValue {
     return false
} else {
     return true
}

Hoffe das hilft jemandem, der das gleiche Problem hat

0
Victor Pacheo

Achten Sie darauf, wenn Sie nach der Konvertierung Datumsangaben vergleichen!

Ich habe zum Beispiel das Asset des Simulators mit Datum als TimeInterval (366144731.9) erhalten, in Millisekunden Int64 (1344451931900) und zurück in TimeInterval (366144731.9000001) konvertiert 

func convertToMilli(timeIntervalSince1970: TimeInterval) -> Int64 {
    return Int64(timeIntervalSince1970 * 1000)
}

func convertMilliToDate(milliseconds: Int64) -> Date {
    return Date(timeIntervalSince1970: (TimeInterval(milliseconds) / 1000))
}

Ich habe versucht, das Asset durch creationDate abzurufen, und es wird das Asset nicht gefunden.

Ich habe mehrere Lösungen ausprobiert, um die Dezimalgenauigkeit von double zu reduzieren, wie round (Intervall * 1000)/1000, Verwendung von NSDecimalNumber usw. ohne Erfolg.

Am Ende holte ich mit Intervall -1 <creationDate <Intervall + 1 anstelle von creationDate == Interval.

Es kann eine bessere Lösung geben !?

0
Rodrigo Fava