Ниже приведен мой первоначальный ответ, который после многих исследований был лишь несколько верным.
Фактический ответ связан с временной частью даты.
Итак ... если мы создадим объект даты с помощью приведенного ниже кода и установим его на известную дату,
let stringDate = "2020-03-08"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let searchDate:Date = dateFormatter.date(from: stringDate)!
, фактический объект будет выглядеть следующим образом
2020-03-08T05:00:00.000Z
Однако, как выглядит объект профиля создается, как это
convenience init(_ content: String) {
self.init()
self.content = content
self.date = Date()
}
, и этот объект даты выглядит так
2020-03-08T16:10:25.123Z
, так что, как вы можете видеть, если мы отфильтруем по определенной дате c, они не равны
2020-03-08T05:00:00.000Z != 2020-03-08T16:10:25.123Z
, поэтому этому
let stringDate = "2020-03-08"
let searchDate:Date = dateFormatter.date(from: stringDate)!
let searchResults = realm.objects(Profile.self).filter("date == %@", searchDate)
не удалось найти дату, поскольку она фильтрует для этого
2020-03-08T05:00:00.000Z
Чтобы исправить, измените класс профиля с помощью отметка даты с отметкой времени по умолчанию
class Profile: Object {
@objc dynamic var date: Date!
@objc dynamic var content: String!
convenience init(_ content: String) {
self.init()
self.content = content
let formatter = DateFormatter()
formatter.timeStyle = .none
formatter.dateFormat = "MM/dd/yy"
let today = Date()
let s = formatter.string(from: today)
let d = formatter.date(from: s)
self.date = d
}
}
или, сохраните ваши даты в виде строки ггггммдд, которая полностью удалит неоднозначность.
- ОРИГИНАЛЬНЫЙ ОТВЕТ НИЖЕ ---
Фильтрация по дате полностью поддерживается для объектов даты. Вот два быстрых примера. Один для фильтрации на указанную c дату (для вашего вопроса) и один для диапазона дат с использованием BETWEEN.
Обратите внимание, у меня есть функция makeDate , которая преобразует строку в дату объект. В этом примере используется объект Realm DogClass, имеющий свойство Date типа dog_birthdate.
Этот фильтр для объектов с указанными c date
let searchDate = self.makeDate(fromString: "06/01/2019")
let specificDateResults = realm.objects(DogClass.self)
.filter("dog_birthdate == %@", searchDate)
for dog in specificDateResults {
print(dog.dog_name)
}
Этот фильтр для объектов в пределах диапазона дат
let startDate = self.makeDate(fromString: "06/01/2019")
let endDate = self.makeDate(fromString: "06/20/2019")
let dateRangeResuls = realm.objects(DogClass.self)
.filter("dog_birthdate BETWEEN {%@,%@}", startDate, endDate)
for dog in dateRangeResuls {
print(dog.dog_name)
}
РЕДАКТИРОВАТЬ : Использование кода в комментарии из OP для тестирования
let stringDate = "2019-06-01"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let searchDate:Date = dateFormatter.date(from: stringDate)!
let result = realm.objects(DogClass.self).filter("dog_birthdate == %@", searchDate)
for dog in result {
print(dog.dog_name)
}
, который отлично работает.