Filter by day from NSDate in Realm, Swift

时光总嘲笑我的痴心妄想 提交于 2019-12-08 13:47:30
bcamur

You can implement this function, from Rafael's answer

private func createMessageRealmModelFromIncomingMessage(incomingMessage: MessageRestModel) -> MessageRealmModel {
    let messageRealmModel = MessageRealmModel()

    messageRealmModel.id = incomingMessage.id!
    messageRealmModel.messageType = "CHAT_MESSAGE"
    messageRealmModel.value = (incomingMessage.content?.value)!
    messageRealmModel.senderId = incomingMessage.senderId!
    messageRealmModel.recipientId = incomingMessage.recipientId!
    messageRealmModel.sendDate = incomingMessage.sendDate!
    messageRealmModel.serverDeliveryDate = incomingMessage.serverDeliveryDate!
    messageRealmModel.receiverDeliveryDate = NSDate().msFromEpoch()

    return messageRealmModel
}

And then use it as a parameter for Realm's filter function like this:

var c = NSDateComponents()
c.year = 2016
c.month = 3
c.day = 27

var date = NSCalendar(identifier: NSCalendarIdentifierGregorian)?.dateFromComponents(c)

let generalListsInDay = realm.objects(GeneralList).filter(self.predicateForDayFromDate(day))

After executing this code your generalListsInDay should contain all GeneralList's in 27.03.2016

So, I find easy way:

  1. Create public extension for String and create function with separate NSDate:

     public static func sepaDate(whatNeed: String) -> String  {
     var currentDate = NSDate()
    let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
    
    let dateComponents = calendar!.components([.Day, .Month, .Year, .Minute, .Hour], fromDate: currentDate)
        var forReturn: String = "0"
        switch whatNeed {
            case "day":
                let valu = String(dateComponents.day)
                forReturn = valu
            case "month":
            let valu = String(dateComponents.month)
            forReturn = valu
            case "year":
            let valu = String(dateComponents.year)
            forReturn = valu
            case "hour":
            let valu = String(dateComponents.hour)
            forReturn = valu
            case "minute":
            let valu = String(dateComponents.minute)
            forReturn = valu
            default: print("Error")
        }
        return forReturn
    }
    }
    
  2. In Realm class, create separate date:

    dynamic var minute = String.sepaDate("minute")
    dynamic var hour = String.sepaDate("hour")
    dynamic var day = String.sepaDate("day")
    dynamic var month = String.sepaDate("month")
    dynamic var year = String.sepaDate("year") 
    
  3. In ViewController call to predicate

     let dayday = String(dateComponents.day)
             let monthmonth = String(dateComponents.month)
             let yearyear = String(dateComponents.year)
            let predicate = NSPredicate(format: "day = %@ AND month = %@ AND year = %@", dayday, monthmonth, yearyear)
            generalRecords = uiRealm.objects(GeneralList).filter(predicate) 
    

I hope it's help somebody...

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!