与日期数组相比,检查给定日期是否最接近当前日期和时间
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 true
或 false
在比较正确的事件上,因为我无法确定哪个日期属于事件。
我认为您可能会遇到困难。看来您真正想要的是所有事件中最早的事件。如果是这样,可以这样完成:
首先,使您的 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
类似的问题我也看过,不过大概是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 true
或 false
在比较正确的事件上,因为我无法确定哪个日期属于事件。
我认为您可能会遇到困难。看来您真正想要的是所有事件中最早的事件。如果是这样,可以这样完成:
首先,使您的 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