webentwicklung-frage-antwort-db.com.de

DateFormatter unter einem Unix-Zeitstempel verwenden

Ich bekomme einen Absturz beim Laufen und es zeigt auf den dateFormmater.timezone. Der Fehler in der Konsole lautet: 

Der Wert des Typs 'Swift.Optional' (0x1192bf4a8) konnte nicht in 'NSTimeZone' (0x1192c0270) umgewandelt werden.

der Wert von rowEvents.date ist "1480134638.0"

Ich versuche, einen Unix-Zeitstempel aus Firebase als String abzurufen. Konvertieren Sie es in Date und speichern Sie es erneut als Zeichenfolge, damit ich es auf einem Zelletikett veröffentlichen kann.

Ich habe diesen Code von StackOverflow erhalten. Ich habe meine Daten eingesteckt und alles ist gut, bis ich es laufen lasse. Ich denke, nicht alles ist gut ...

if let lastUpdated : String = rowEvents.date {

    let epocTime = TimeInterval(lastUpdated)! / 1000 // convert it from milliseconds dividing it by 1000

    let unixTimestamp = NSDate(timeIntervalSince1970: epocTime) //convert unix timestamp to Date

    let dateFormatter = DateFormatter()
    dateFormatter.timeZone = NSTimeZone() as TimeZone!
    dateFormatter.locale = NSLocale.current // NSLocale(localeIdentifier: "en_US_POSIX")
    dateFormatter.dateFormat =  "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
    dateFormatter.date(from: String(describing: unixTimestamp))

    let updatedTimeStamp = unixTimestamp
    let cellDate = DateFormatter.localizedString(from: updatedTimeStamp as Date, dateStyle: DateFormatter.Style.full, timeStyle: DateFormatter.Style.medium)

    cell.subtitleLabel.text = cellDate              
}

Das Ergebnis kam hier aus diesem Code:

let myTimeStamp = self.datePicker?.date.timeIntervalSince1970

let calendarDate = String(describing: myTimeStamp! /** 1000*/)
27
CRey

Sie können unixTimestamp mit Date(timeIntervalSince1970:) in Datum konvertieren.

let unixTimestamp = 1480134638.0
let date = Date(timeIntervalSince1970: unixTimestamp)

Wenn Sie das Datum in einem String mit einem bestimmten Format anzeigen möchten, können Sie DateFormatter wie folgt verwenden.

let date = Date(timeIntervalSince1970: unixtimeInterval)
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(abbreviation: "GMT") //Set timezone that you want
dateFormatter.locale = NSLocale.current
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm" //Specify your format that you want
let strDate = dateFormatter.string(from: date)
78
Nirav D

Das Problem ist die Zeile dateFormatter.timeZone = NSTimeZone() as TimeZone!.

Verwenden Sie einfach TimeZone anstelle von NSTimeZone wie
dateFormatter.timeZone = TimeZone.current und Ihr Code wird funktionieren.

Sie können auch Ihren / 1000 entfernen, da 1480134638.0 eher wie Sekunden als Millisekunden aussieht (seit 1970).

7
d.felber

Schnell 4.1. Ich habe eine Funktion erstellt. Übergeben Sie einfach timeStamp in function param und function gibt Daten im String-Datentyp zurück. Sie können dem DateFormatter-Objekt weitere Eigenschaften hinzufügen.

func getDateFromTimeStamp(timeStamp : Double) -> String {

        let date = NSDate(timeIntervalSince1970: timeStamp)

        let dayTimePeriodFormatter = DateFormatter()
        dayTimePeriodFormatter.dateFormat = "dd MMM YY, hh:mm a"
     // UnComment below to get only time
    //  dayTimePeriodFormatter.dateFormat = "hh:mm a"  

        let dateString = dayTimePeriodFormatter.string(from: date as Date)
        return dateString
    }
2
GSK

Diese Lösung gilt für Swift 3 -> 4.2:

sie können im Double eine Erweiterung hinzufügen, die das formatierte Datum zurückgibt:

extension Double {


    // returns the date formatted.    
    var dateFormatted : String? {
        let date = Date(timeIntervalSince1970: self)
        let dateFormatter = DateFormatter()
        dateFormatter.timeStyle = DateFormatter.Style.none //Set time style
        dateFormatter.dateStyle = DateFormatter.Style.short //Set date style
        return dateFormatter.string(from: date)
     }

    // returns the date formatted according to the format string provided. 
    func dateFormatted(withFormat format : String) -> String{
         let date = Date(timeIntervalSince1970: self)
         let dateFormatter = DateFormatter()
         dateFormatter.dateFormat = format
         return dateFormatter.string(from: date)
    }

}

beispiel oben: 

let timeStamp = 82749029.0
print(timeStamp. dateFormatted)
//output
//12/11/1994



let timeStamp = 82749029.0
print(timeStamp. dateFormatted(withFormat : "MM-dd-yyyy HH:mm"))
//output
//12-11-1994 13:04
0
MhmdRizk

Mit dem Spielplatz habe ich das alles gemacht. 

let epochTime = 1547855446
let newTime = Date(timeIntervalSince1970: TimeInterval(epochTime))
print(newTime)

Gibt dies zurück - 2019-01-18 23:50:46 +0000

0
wilkinsonncl