web-dev-qa-db-fra.com

Utilisation de DateFormatter sur un horodatage Unix

Je reçois un crash lors de l'exécution et il pointe sur le dateFormmater.timezone. L’erreur dans la console est: 

Impossible de convertir la valeur de type 'Swift.Optional' (0x1192bf4a8) en 'NSTimeZone' (0x1192c0270).

la valeur de rowEvents.date est "1480134638.0"

J'essaie d'extraire un horodatage Unix de Firebase enregistré en tant que chaîne. Convertissez-le en Date et sauvegardez-le à nouveau sous forme de chaîne afin que je puisse l'afficher sur une étiquette de cellule.

J'ai reçu ce code de StackOverflow. J'ai branché mes données et tout va bien jusqu'à ce que je l'utilise. Je suppose que tout n'est pas tout bon ...

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              
}

Le résultat provient de ce code ici:

let myTimeStamp = self.datePicker?.date.timeIntervalSince1970

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

Vous pouvez convertir unixTimestamp en date en utilisant Date(timeIntervalSince1970:).

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

Si vous souhaitez afficher la date sous forme de chaîne avec un format spécifique, vous pouvez utiliser DateFormatter comme ceci.

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

Le problème est la ligne dateFormatter.timeZone = NSTimeZone() as TimeZone!.

Utilisez simplement TimeZone au lieu de NSTimeZone comme
dateFormatter.timeZone = TimeZone.current et votre code fonctionnera.

Vous pouvez également supprimer votre / 1000 car 1480134638.0 ressemble plus à des secondes qu'à des millisecondes (depuis 1970).

7
d.felber

Swift 4.1. J'ai créé une fonction. Il vous suffit de passer timeStamp dans la fonction param et cette fonction renverra des données sous forme de type chaîne. Vous pouvez ajouter plus de propriétés à l'objet DateFormatter.

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

Cette solution est valable pour Swift 3 -> 4.2:

vous pouvez ajouter une extension sur le Double qui renvoie la date formatée:

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

}

exemple sur ce qui précède: 

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

En utilisant un terrain de jeu, tout ce que j'ai fait était celui-ci. 

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

Retourne ceci - 2019-01-18 23:50:46 +0000

0
wilkinsonncl