按日期快速筛选数组

时间:2017-07-24 23:12:43

标签: arrays swift date filter

我有一个像这样的json

    [
  {
    "place": "somewhere",
    "dateStart": "2017-02-25+01:00",
    "name": "name of the event",
    "dateEnd": "2017-06-18+02:00",
    "region": "region 1";

  },
  {
    "place": "another place",
    "dateStart": "2017-03-25+01:00",
    "name": "another name",
    "dateEnd": "2017-08-18+02:00",
    "region": "region 2";
  },
...
]

“dateStart”和“dateEnd”的格式为String

我用swiftyjson解析它

let fileManager = FileManager.default
        let documentsPath = try! fileManager.url(for:.documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
        let filePath = documentsPath.appendingPathComponent("events.json")
        let url = filePath
        let data = try? Data(contentsOf: url)
        if data != nil {
            stringJson = JSON(data: data!)
        }

        guard let json = stringJson.array else { return }

我可以使用以下方法过滤此数组:

let filteredArrayByRegion = json.filter{$0["region"].string == "region name"}

但现在我想通过“dateEnd”过滤数组,我想要“dateEnd”大于“今天”的记录。

我知道我必须在日期转换字符串[“dateEnd”]。字符串,但我无法创建用于过滤数组的闭包。

有人能让我走上正轨吗?

提前谢谢

1 个答案:

答案 0 :(得分:3)

通常您需要将日期字符串转换为Date个实例,然后您可以将这些Date个实例与Date()进行比较("现在")。

但是您拥有的字符串格式可以作为字符串进行比较。因此,您可以将今天的日期作为相同格式的字符串,然后将每个dateEnd字符串与" now"进行比较。串。此字符串比较仅适用于非常具体的日期/时间格式,并且您的字符串恰好采用该格式。

我假设+字符串中dateEnd之后的值是时间而不是时区偏移量。

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd+HH:mm"
let nowString = formatter.string(from: Date())

现在,您可以在过滤器中使用nowString

let results = someArray.filter { ($0["dateEnd"] ?? "") > nowString }

其中someArray是你的字典数组。