Search code examples
iosswiftnsdatenspredicatensdateformatter

How to use Date Object (to dd-MM-yyyy HH:mm:ss) for using it in NSPredicate in Swift


I have arrData of dictionary, I want to filter based on PERSON_ID, p_punchTime(string dd-MM-yyyy HH:mm:ss) using prevDate and currDate in NSPredicate

  "aarData": [
        {
          "PERSON_ID": 100000000530788,
          "p_comments": "",
          "p_person": " Amal Abutaleb",
          "p_personId": "100000000530788",
          "p_punchTime": "25-08-2020 10:32:53",
          "p_punchType": IN,
        },
        {
          "PERSON_ID": 100000000530788,
          "p_comments": "",
          "p_person": " Amal Abutaleb",
          "p_personId": "100000000530788",
          "p_punchTime": "25-08-2020 10:32:59",
          "p_punchType": OUT, 
        }
      ]

How to use Date Object/string (to dd-MM-yyyy HH:mm:ss) for using it in NSPredicate in Swift.

when I pass strCurrdate and strPrevdate in NSPredicate works but filter returns all aarData, so Does string Date in NSPredicate do not work in the filter?

My Code:

let formatter = DateFormatter()
formatter.dateFormat = "dd-MM-yyyy HH:mm:ss"
let strCurrdate = formatter.string(from: (NHNetworkClock.shared()?.networkTime)! as Date )
let currdateObj = formatter.date(from: strCurrdate)! as NSDate    
print("currdateObj : \(currdateObj)")      //prints 2020-08-24 13:54:03 +0000 ,need dd-MM-yyyy HH:mm:ss
            
            
           
var dayComponent = DateComponents()
dayComponent.day = -1 // For removing one day (yesterday): -1
let theCalendar  = Calendar.current
let prevDate = theCalendar.date(byAdding: dayComponent, to:(NHNetworkClock.shared()?.networkTime)! as Date)
print("prevDate : \(prevDate)") 
let strPrevdate = formatter.string(from: prevDate!)  //gives string dd-MM-yyyy HH:mm:ss
let prevDateObj = formatter.date(from: strPrevdate)! as NSDate
print("prevDateObj : \(prevDateObj)")   //prints 2020-08-24 13:54:03 +0000, need dd-MM-yyyy HH:mm:ss
let resultPredicate = NSPredicate(format: "PERSON_ID CONTAINS %@ AND ( p_punchTime >= %@ AND p_punchTime <= %@)", NSString.init(format: "%@",Constants().EMPLOYEE_ID() as String),prevDateObj! as NSDate,currdateObj! as NSDate)
filteredArr = arrData.filtered(using: predicate) as NSArray 
//NOTE: aarData contains p_punchTime in format string dd-MM-yyyy HH:mm:ss

log

(lldb) po resultPredicate
PERSON_ID CONTAINS "100000000530788" AND p_punchTime >= CAST(619860816.000000, "NSDate") AND p_punchTime <= CAST(619947216.000000, "NSDate")

I'm getting this error

libc++abi.dylib: terminating with uncaught exception of type NSException

Any lead on this


Solution

  • I changed my NSPredicate to string Date, working now

    let resultPredicate = NSPredicate(format: "PERSON_ID == %@ AND (p_punchTime >= %@ AND p_punchTime <= %@)", NSString.init(format: "%@",Constants().EMPLOYEE_ID() as String),strPrevdate,strCurrdate )
    filteredArr = arrData.filtered(using: resultPredicate) as NSArray