与日期数组相比,检查给定日期是否最接近当前日期和时间

Check if a given date is the closest to the current date and time compared to an array of dates

类似的问题我也看过,不过大概是6年前的事了,我觉得不直接回答问题。

我有一个 'events' 的数组,它遵循以下模型:

struct Event: Identifiable{
    var id = UUID().uuidString
    var eventTitle: String
    var eventDescription: String
    var eventDate: Date
}

以及示例数据:

@Published var storedEvents: [Event] = [
    Event(eventTitle: "Go shopping", eventDescription: "Eggs, flour, butter", eventDate: .init(timeIntervalSince1970: 1646078400)),
    Event(eventTitle: "Lecture with bob", eventDescription: "Room 453", eventDate: .init(timeIntervalSince1970: 1646078708))
    
]

对于任何给定的事件,我希望将事件的日期传递给一个函数,该函数接受 Date 和 returns true 或 false 无论给定的事件日期是 closest/current 事件在当前日期时间与所有其他事件的日期相比(即,如果我有两个事件,一个用于 8:15,一个用于 8:30,并且当前时间为 8:21,则第一个事件应该是当前事件,因此 return 在我的函数中为真。

我有一个功能只考虑小时,所以如果两个事件的时间相同,那么它们都会被选中并且都 return true:

func isCurrentHour(date: Date)-> Bool{
    
    let calendar = Calendar.current
    
    let hour = calendar.component(.hour, from: date)
    let currentHour = calendar.component(.hour, from: Date())
    
    return hour == currentHour
}

我尝试将日期列表从最早到最晚排序,然后将每个日期与当前时间进行比较,但我不确定如何 return truefalse在比较正确的事件上,因为我无法确定哪个日期属于事件。

我认为您可能会遇到困难。看来您真正想要的是所有事件中最早的事件。如果是这样,可以这样完成:

首先,使您的 Event 结构在日期之前符合 Comparable

struct Event: Identifiable, Comparable {
    
    var id = UUID().uuidString
    var eventTitle: String
    var eventDescription: String
    var eventDate: Date
    
    static func < (lhs: Event, rhs: Event) -> Bool {
        lhs.eventDate < rhs.eventDate
    }
}

然后就可以return数组中的最小元素了。以下将 return 时间上最早的事件,但请记住,如果您需要的话,没有检查它以确保它是未来最早的事件。

private func earliestEvent(events: [Event]) -> Event? {
    return events.min()
}

这个 return 是一个可选的 Event 因为它可能会失败,例如在数组为空的情况下。

编辑:

private func earliestEvent(event: Event, events: [Event]) -> Bool {
    guard let earliestEvent = events.min() else { return false }
    return event == earliestEvent
}

我建议作为一种解决方案,只取到目前为止日期的间隔,然后比较这两个间隔。

func timeIntervalSince(_ date: Date) -> TimeInterval

文档here