2016-07-23 5 views
-2

Ich möchte UNIX Millis (vom Server zurückgegeben) in NSDate mit Swift konvertieren. Dies sind die zurückgegebenen Daten:Wie konvertiert man Unix Millis zu NSDate auf 32 Bit iPhone

{ 
    timestamp: 1469263452058 
} 

Es funktioniert perfekt auf iPhone 5S und höher. Aber es scheiterte auf dem iPhone 5, weil es 32 Bit ist. Ich habe auch versucht, den Wert in Int64 zu werfen und es stürzte ab.

Bitte nicht hartcodieren die 1469263452058. Ich muss den Zeitstempel in Variable speichern, bevor ich es in NSTimeInterval konvertieren kann.

+1

Wie konvertieren Sie die Zeit 'NSDate'? – Sulthan

+0

Ist der Zeitstempel aus dem Jahr 48529? – pableiros

+0

@pableiros Nein, bitte geben Sie diese Website ein, und legen Sie den Zeitstempel http://currentmillis.com/ –

Antwort

2

Sie haben von 1000 zu unterteilen den Zeitstempel

Zum Beispiel:

Swift 2

let result = try! NSJSONSerialization.JSONObjectWithData(jsonFromServer, options: []) 

if let timestamp = result["timestamp"] as? Double { 
    let timeInterval: NSTimeInterval = timestamp/1000 

    print("time interval is \(timeInterval)") 
    //Convert to Date 
    let date = NSDate(timeIntervalSince1970: timeInterval) 

    //Date formatting 
    let dateFormatter = NSDateFormatter() 
    dateFormatter.dateFormat = "dd, MMMM yyyy HH:mm:a" 
    dateFormatter.timeZone = NSTimeZone(name: "UTC") 
    let dateString = dateFormatter.stringFromDate(date) 
    print("formatted date is = \(dateString)") 
} 

Swift 4

let result = try! JSONSerialization.jsonObject(with: jsonFromServer as Data, options: []) 

if let timestamp = result["timestamp"] as? Double { 
    let timeInterval: TimeInterval = timestamp/1000 

    print("time interval is \(timeInterval)") 
    //Convert to Date 
    let date = NSDate(timeIntervalSince1970: timeInterval) 

    //Date formatting 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "dd, MMMM yyyy HH:mm:a" 
    dateFormatter.timeZone = NSTimeZone(name: "UTC")! as TimeZone 
    let dateString = dateFormatter.string(from: date as Date) 
    print("formatted date is = \(dateString)") 
} 

Ausgabe:

time interval is 1469263452.058 
formatted date is = 23, July 2016 08:44:AM 
+0

1469263452058 ist in den zurückgegebenen JSON-Daten und ist zu groß für 32bit Datentyp enthalten. In Ihrem Beispiel ist der 1469263452058 fest codiert, aber wenn ich die Daten abrufe, muss er zuerst in die Variable eingefügt werden. –

+0

@EdwardAnthony Haben Sie versucht, den Wert auf ein Double zu setzen? – pableiros

+0

NSTimeInterval oder Double ist 64 Bit, aber die Doppelbitzuweisung wird zwischen Exponent und und Bruch geteilt. Daher ist es nicht möglich, den Zeitstempel zu enthalten. Ich brauche einen Weg, um den Zeitstempel zu speichern, bevor ich es mit 1000 teilen kann. –

1

Dies sollte funktionieren. Ich habe es in Playground versucht.

let timestamp: Double = 1469263452058/1000 
let timeWithNSDate = NSDate.init(timeIntervalSince1970: timestamp) 

Ausgang:

"Jul 23, 2016, 2:14 PM"

+0

In Ihrem Beispiel ist 1469263452058 fest codiert. Wenn ich die Daten als JSON-Antwort vom Server empfange, muss ich zuerst die Variable 1469263452058 in der Variablen speichern, aber sie ist zu groß für den 32-Bit-Datentyp. –

+0

@EdwardAnthony Sie können den obigen Code beim Analysieren des JSON verwenden. Ersetzen Sie einfach den fest codierten Wert durch 'json [" timestamp "]'. – thegrandhi

+0

@EdwardAnthony Da Float ein 32-Bit-Datentyp ist, verwenden Sie den JSON-Wert als Gleitkommazahl: 'let timestamp: Float = 1469263452058/1000' und wandeln Sie das dann in double um. So: 'let tim: Double = Double (Zeitstempel)' Dann verwenden Sie einfach die NSDate timeIntervalSince1970 Methode, um NSDate zu bekommen. – thegrandhi