【问题标题】:swift filter array by date按日期快速过滤数组
【发布时间】:2017-12-30 16:23:22
【问题描述】:

我有一个这样的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”大于“today”的记录。

我知道我必须将字符串 ["dateEnd"].string 转换为日期,但我无法创建闭包来过滤数组。

谁能让我走上正轨?

提前谢谢你

【问题讨论】:

  • 将字符串解析为日期,并与今天进行比较。
  • 我尝试:code let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd HH:mm" 然后:code let eventiRegionaliPerData = json.filter { json 作为回报dateFormatter.date(来自:json[“eventoDataFine”].string!)! >= 日期() }
  • 那是什么问题?
  • @GiuseppeSala 不要在 cmets 中发布代码。请edit您的问题提供所有相关信息。
  • "我想要 dateEnd 大于 'today' 的记录" ...因此,如果您所在位置的今天日期为 "2017-07-24+06:00",则为 " 2017-07-24+07:00”要“比今天更大”?看到日期字符串的时区调整有点不寻常(当然,对于日期时间字符串,但对于日期字符串不太常见)。或者您是否想将它们视为“与今天相同”,尽管时区发生了变化?还是在您的示例中+01:00 不是时区更改,而是小时和分钟?如果是这样,那么在该字符串中使用 + 而不是 T 会很奇怪。那么这些日期字符串是什么时区?

标签: arrays swift date filter


【解决方案1】:

通常您需要将日期字符串转换为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 是您的字典数组。

【讨论】:

    猜你喜欢
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 2014-09-11
    • 1970-01-01
    • 2022-12-18
    • 2021-05-25
    • 1970-01-01
    相关资源
    最近更新 更多