1

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

代码如下所示:

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

此代码在 Mac OSX 中运行良好。但是在 Linux 中,created["$date"] as? Int64始终是nil.

我尝试了几件事,包括使用DoubleandNSNumber而不是 Int64 但它仍然是nil.

关于如何访问此号码的任何想法?我需要将其转换为可读的日期,而我这样做的方式是TimeInterval()在 1970 年之后的几秒钟内需要一个 Double 值,因此它需要可被 1000 整除并在该步骤中可转换为 Double。

intDate编辑:这是仍然存在的 NSNumber 代码,nil因此不会落入该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]] 
4

1 回答 1

1

显然,整数类型和 Linux 上的 Swift 之间只有有限的转换NSNumber,因此您必须转换为确切的类型,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)
}
于 2017-10-11T08:49:49.107 回答