Использование DateFormatter на метке времени Unix
Во время работы я получаю сбой, и он указывает на dateFormmater.timezone
.
Ошибка в консоли:
Невозможно передать значение типа Swift.Optional(0x1192bf4a8) в 'NSTimeZone' (0x1192c0270).
значение rowEvents.date
равно "1480134638.0"
Im пытается вытащить временную метку Unix из Firebase, сохраненной как строка. Преобразуйте его в Date и снова сохраните его как строку, чтобы я мог опубликовать его на ярлыке ячейки.
Я получил этот код из StackOverflow. Я подключил свои данные, и все хорошо, пока я не запустил его. Я думаю, все не все хорошо...
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
}
Результат пришел из этого кода здесь:
let myTimeStamp = self.datePicker?.date.timeIntervalSince1970
let calendarDate = String(describing: myTimeStamp! /** 1000*/)
Ответы
Ответ 1
Вы можете преобразовать unixTimestamp
на сегодняшний день, используя Date(timeIntervalSince1970:)
.
let unixTimestamp = 1480134638.0
let date = Date(timeIntervalSince1970: unixTimestamp)
Если вы хотите отображать дату в строке с определенным форматом, вы можете использовать DateFormatter
таким образом.
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)
Ответ 2
Проблема заключается в строке dateFormatter.timeZone = NSTimeZone() as TimeZone!
.
Просто используйте TimeZone
вместо NSTimeZone
, как, например,
dateFormatter.timeZone = TimeZone.current
, и ваш код будет работать.
Вы также можете удалить свой / 1000
, потому что 1480134638.0
больше похоже на секунды, чем миллисекунды (с 1970 года).
Ответ 3
Свифт 4.1. Я создал функцию. Просто передайте timeStamp в параметре функции, и функция вернет данные в виде строкового типа. Вы можете добавить больше свойств к объекту 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
}
Ответ 4
Это решение действительно для swift 3 → 4.2:
Вы можете добавить расширение в Double, которое возвращает форматированную дату:
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)
}
}
пример на вышеупомянутом:
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
Ответ 5
На детской площадке все, что я сделал, это
let epochTime = 1547855446
let newTime = Date(timeIntervalSince1970: TimeInterval(epochTime))
print(newTime)
Возвращает это - 2019-01-18 23:50:46 +0000