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*/)
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)
Le problème est la ligne dateFormatter.timeZone = NSTimeZone() as TimeZone!
.
Utilisez simplement TimeZone
au lieu de NSTimeZone
commedateFormatter.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).
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
}
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
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