代码之家  ›  专栏  ›  技术社区  ›  Tyress

在Swift Linux中展开长数据类型

  •  1
  • Tyress  · 技术社区  · 8 年前

    我正试图从MongoDB中获取一条具有DateTime属性的记录。此属性是ISODate,但通过完美的MongoDB API作为长数据类型(自1970年以来的毫秒数)接收。

    代码如下所示:

    if var something = dictionary["Something"] as? [String:Any], var intDate = something["$date"] as? Int64
    {
     let date = Date(timeIntervalSince1970: TimeInterval(intDate/1000))
    }
    

    created["$date"] as? Int64 总是 nil

    我试过几种方法,包括使用 Double NSNumber 而不是Int64,但它仍然是 .

    TimeInterval() 1970年后的秒数需要一个双倍值,因此需要被1000整除,并在该步骤中转换为双倍。

    编辑:这是NSNumber代码,其中 intDate let date 线 something 不是零

    if var something = dictionary["Something"] as? [String:Any], var intDate = something["$date"] as? NSNumber
    {
      let date = Date(timeIntervalSince1970: TimeInterval(NSDecimalNumber(decimal:intDate.decimalValue/1000).doubleValue))
    }
    

    编辑2:本例的示例词典:

    var dictionary : [String:Any] = ["SomethingElse":"SomeOtherData","Something":["$date": 1507710414599]] 
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Martin R    8 年前

    显然,整数类型和 NSNumber 在Linux上的Swift中,您必须强制转换为确切的类型, Int 在这种情况下:

    let dictionary : [String: Any] = ["SomethingElse":"SomeOtherData","Something":["$date": 1507710414599]]
    
    if let something = dictionary["Something"] as? [String:Any],
        let numDate = something["$date"] as? Int {
    
        let date = Date(timeIntervalSince1970: Double(numDate)/1000)
        print("Date:", date)
    }
    
    推荐文章