【问题标题】:How to filter a Struct array by Date? [duplicate]如何按日期过滤结构数组? [复制]
【发布时间】:2015-11-04 19:30:15
【问题描述】:

我有一个结构,例如:

struct AdData {
    var AdRequest = Int?()
    var Date = NSDate?() // eg: 2015-11-01 04:00:00 +0000
}

还有一个AdData的数组:

var RawDataFromDb = [AdData]()

我想找到RawDataFromDbDate 与今天日期匹配的所有项目。我想我必须以某种方式删除 AdData Date 组件的时间组件以仅比较日期,但我正在努力寻找一个优雅的解决方案。

到目前为止,我尝试了这个但没有成功:

public func ==(lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs === rhs || lhs.compare(rhs) == .OrderedSame
}

public func <(lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.compare(rhs) == .OrderedAscending
}

extension NSDate: Comparable { }


let TodayDate = NSDate()
let TodayRows = RawDataFromDb.filter{($0.Date == TodayDate}

感谢您的帮助!

【问题讨论】:

  • 解释您认为“日期与今天的日期匹配的位置”是什么意思。你的意思是它的日子,不管时间,都应该和今天一样,不管时间?
  • 是的,就是这样!抱歉我不是很清楚
  • 我很确定您会在引用线程的答案中找到解决方案,例如使用来自这个答案的isDateInTodaystackoverflow.com/a/25538987/1187415。否则请告诉我,我会重新提出问题。
  • 嗨马丁,谢谢你的链接。尽管它确实提供了一些有用的信息,但我建议我们将这个线程保持打开状态,因为它与结构特别相关,并且此处给出的答案与您链接的帖子中的答案大不相同。

标签: swift struct nsdate foundation


【解决方案1】:

根据 Martin R 的评论和link,您可以使用 isDateInToday!这很简单

你可以试试这样的:

let gregorianCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!

let TodayRows = RawDataFromDb.filter{
    return self.gregorianCalendar.isDateInToday($0.Date)
}

至于我喜欢使用的等号:

extension NSDate: Comparable { }

public func ==(leftDate: NSDate, rightDate: NSDate) -> Bool {
    return leftDate.isEqualToDate(rightDate)
}

如果您使用它,而不是 isDateInToday,您需要将 Todaystruct.Date 的小时数设置为 12(以便比较夏令时第一天的日期)和分钟数/秒归零。因为小时、分钟和秒确实会影响比较。

例如:

let gregorianCalendar: NSCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
let today: NSDate = gregorianCalendar.dateBySettingHour(12, minute: 0, second: 0, ofDate: NSDate(), options: NSCalendarOptions())!

let TodayRows = RawDataFromDb.filter{
    let structDate = self.gregorianCalendar.dateBySettingHour(12, minute: 0, second: 0, ofDate: NSDate(), options: NSCalendarOptions())!
    return structDate == self.today
}

【讨论】:

  • 您应该使用 12pm 而不是 12am 进行此类比较,因为并非每天都从 12am 开始
  • 您能进一步解释一下吗? :) 谢谢!
  • 夏令时
  • 所以你的意思是公历不利于夏令时?
  • 哦,对了。车轮慢慢转动,哈哈;)所以不要将小时数设置为零,而是将它们设置为 12。Obrigado
【解决方案2】:

最简单的,就在今天:

let calendar = NSCalendar.autoupdatingCurrentCalendar()

let targetData = rawData.filter({
  $0.date != nil && calendar.isDateInToday($0.date!)
})

任意一天:

let calendar = NSCalendar.autoupdatingCurrentCalendar()

let targetDate = NSDate(timeIntervalSince1970: 123456789)

let targetData = rawData.filter({
  $0.date != nil && calendar.isDate($0.date!, inSameDayAsDate: targetDate)
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 2021-05-25
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多