在Unix时间戳上使用DateFormatter

时间:2016-11-17 06:41:51

标签: swift date nsdateformatter date-formatting

我跑步时遇到了崩溃,它指向dateFormmater.timezone。 控制台中的错误是:

  

无法转换类型' Swift.Optional' (0x1192bf4a8)到' NSTimeZone' (0x1192c0270)。

rowEvents.date的值为"1480134638.0"

我试图从Firebase中提取一个保存为字符串的Unix时间戳。将其转换为日期并再次将其保存为字符串,以便将其发布到单元格标签上。

我从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*/)

6 个答案:

答案 0 :(得分:87)

您可以使用unixTimestampDate(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)

答案 1 :(得分:7)

问题是行dateFormatter.timeZone = NSTimeZone() as TimeZone!

只需使用TimeZone代替NSTimeZone dateFormatter.timeZone = TimeZone.current并且您的代码可以使用。

您也可以删除/ 1000,因为1480134638.0看起来更像是秒而不是毫秒(自1970年以来)。

答案 2 :(得分:2)

迅速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
    }

答案 3 :(得分:0)

我在操场上所做的就是这个。

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

返回此-2019-01-18 23:50:46 +0000

答案 4 :(得分:0)

extension Double{ 
 func convertDate(formate: String) -> String { 
  let date = (timeIntervalSince1970: self)
  let dateFormatter = DateFormatter()
  dateFormatter.timeZone = TimeZone.current
  dateFormatter.locale = NSLocale(localeIdentifier: "(your localization language)" ) as Locale //localization language
  dateFormatter.dateFormat = formate //Specify your format that you want let 
  strDate = dateFormatter.string(from: date)
  return strDate
 }
}

//usage
let timeStamp:Double = Double(1595407043)
print(timeStamp.convertDate(formate: "EEEE dd/MM/YYY"))

答案 5 :(得分:-1)

此解决方案对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