【问题标题】:Using DateFormatter on a Unix timestamp在 Unix 时间戳上使用 DateFormatter
【发布时间】:2016-11-17 06:41:50
【问题描述】:

我在运行时发生崩溃,它指向dateFormmater.timezone。 控制台中的错误是:

无法将“Swift.Optional”(0x1192bf4a8) 类型的值转换为“NSTimeZone”(0x1192c0270)。

rowEvents.date 的值为"1480134638.0"

我试图从 Firebase 中提取一个保存为字符串的 Unix 时间戳。将其转换为 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*/)

【问题讨论】:

    标签: swift date nsdateformatter date-formatting


    【解决方案1】:

    您可以使用Date(timeIntervalSince1970:)unixTimestamp 转换为日期。

    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)
    

    【讨论】:

    • TimeZone(abbreviation: "GMT") — 最后,有人使用 TimeZone 构造函数而不是 NSTimeZone 构造函数。
    • 非常感谢先生!最重要的解决了它,因为我不在乎什么格式。如果我需要某种格式,我相信底部代码也会。下次我必须进行转换时,我会记住这两个代码!!!
    • @ReyCerio 欢迎朋友 :)
    • @HimanshuMoradiya 您只需要使用DateFormatter 方法date(from:) 获取日期对象,一旦您拥有Date 对象,您就可以轻松地从中获取时间戳
    • @HimanshuMoradiya 让 date = Date() 让 timeStamp = date.timeIntervalSince1970 。这段代码在 swift 5
    【解决方案2】:

    问题出在dateFormatter.timeZone = NSTimeZone() as TimeZone!这一行。

    只需使用TimeZone 而不是NSTimeZone 就像
    dateFormatter.timeZone = TimeZone.current 这样你的代码就可以工作了。

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

    【讨论】:

    • 谢谢先生!由于您的建议,我取出了 /1000。
    • 感谢您的建议! /1000 后会变好
    【解决方案3】:

    斯威夫特 4.1。我创建了一个函数。只需在函数参数中传递时间戳,函数将返回字符串数据类型的数据。您可以向 DateFormatter 对象添加更多属性。

    func getDateFromTimeStamp(timeStamp : Double) -> String {
    
            let date = NSDate(timeIntervalSince1970: timeStamp / 1000)
            
            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
        }
    

    【讨论】:

    • 它在倒数第二行给出错误“无法将'NSDate'类型的值转换为强制类型'Date'”
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:
      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"))
      

      【讨论】:

      • 请您为您的答案添加解释?
      【解决方案6】:

      此解决方案适用于 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-23
        • 2021-02-12
        • 1970-01-01
        • 2010-11-14
        • 2019-03-06
        • 1970-01-01
        相关资源
        最近更新 更多