Я бы хотел показать представление SwiftUI, только если номер текущего дня равен номеру дня, хранящемуся в моем атрибуте CoreData.
Сначала я попробовал эту строку ниже, но это кажется невозможным:
if (example.date!, format: .dateTime.day(.twoDigits)) == (Date(), format: .dateTime.day(.twoDigits)) {
Затем я попробовал эту строку ниже, которую нашел в Интернете:
if Calendar.current.isDate(example.date!, equalTo: Date(), toGranularity: .day) {
Но это не работает, как ожидалось. Это нормально, только если обе даты 04/02/2023
, но не в том случае, если даты 04/02/2023
и 05/02/2023
.
У вас есть идея? Спасибо!
Я думаю, что ОП использует американские даты, поэтому 04/02/2023
означает 2 апреля, а не 4 февраля. Они хотят сравнить только номер дня, игнорируя месяц и год, и поэтому код isDate toGranularity делает не то, что они хотят. Как сказал lorem ipsum, решение состоит в том, чтобы извлечь только номер дня, используя DateComponents
.
Джефф прав насчет американских дат. Кроме того, inSameDayAs:
не работает должным образом. Попробую DateComponents
если не сложно. Спасибо!
Добавьте вспомогательную функцию в качестве расширения Date
, которая проверяет значение определенного компонента даты на равенство.
extension Date {
func isValueOfComponent(_ component: Calendar.Component, equalTo date: Date) -> Bool {
Calendar.current.component(component, from: self) == Calendar.current.component(component, from: date)
}
}
затем сравните
if example.date!.isValueOfComponent(.day, equalTo: Date())
Более гибкое решение, способное учитывать несколько компонентов, — это
extension Date {
func isDateEqual(to date: Date, matching components: Set<Calendar.Component>) -> Bool {
Calendar.current.dateComponents(components, from: self) == Calendar.current.dateComponents(components, from: date)
}
}
и использовать его
if example.date!.isDateEqual(to: Date(), matching: [.month, .day])
Спасибо! Это работает очень хорошо. Я также нашел это: zerotoappstore.com/… если это может помочь кому-то еще.
dateComponents(_: from:,to:
учитывает также более значимые компоненты, работает как inSameDayAs:
.
Используйте компоненты даты