Swift coreData - 格式化日期并在谓词中使用它

Posted

技术标签:

【中文标题】Swift coreData - 格式化日期并在谓词中使用它【英文标题】:Swift coreData - format date and use it in predicate 【发布时间】:2017-09-14 10:57:49 【问题描述】:

H. 我有一个名为 Agendadate 的实体和一个名为 AgendaEvent 的实体。 AgendaEvent 与 AgendaDate (agendaDates) 有多对多的关系。

在我的 AgendaDate 中,我有一个对象日期(日期类型)。

我正在使用这样的谓词:

fetchRequest.predicate = NSPredicate(format: "ANY agendaDates.dates == %@", date as CVarArg)

我正在尝试将日期格式化为:

“dd MM yyyy”而不是“yyyy MM dd hh:mm:ss”

我需要在谓词中比较两个日期但没有时间? 有可能吗?

更新----- 这是我按照您的建议更新的功能:

func agendaEventsWithDate(date: Date) -> NSFetchRequest<AgendaEvent>

    // create a fetch request that will retrieve all the AgendaEvents.
    let fetchRequest = NSFetchRequest<AgendaEvent>(entityName: "AgendaEvent")

    // set the predicate to only keep AgendaEvents where the related AgendaDate's date matches the passed in date.
    let cal = Calendar.current
    let startOfDay = cal.startOfDay(for: eventDate)
    let endOfDay = cal.date(byAdding: .day, value: 1, to: startOfDay)!
    print(startOfDay)
    print(endOfDay)
    // fetchRequest.predicate = NSPredicate(format: "ANY agendaDates.agendaDates == %@", date as CVarArg)
     fetchRequest.predicate = NSPredicate(format: "SUBQUERY(agendaDates, $a, $a.dates >= %@ AND $a.dates < %@).@count > 0",
                                startOfDay as NSDate, endOfDay as NSDate)

    return fetchRequest

这里的函数应该配置单元格并只获取与所选日期具有相同日期的事件:

func configuringCell(cell: CalendarAgendaCell, indexPath: IndexPath) 
    for dates in calendar.selectedDates 
        for dateOfEvent in myEventDate 
            formatter.dateFormat = "dd MM yyyy"
            let dateToCompare = formatter.string(from: dates)
            formatter.dateFormat = "dd-MM-yyyy"
            let comparingDate = formatter.date(from: dateToCompare)!
            if dateOfEvent == dateToCompare 
                myTempEvents = try! context.fetch(agendaEventsWithDate(date: comparingDate))
                let myEvent = myTempEvents[indexPath.row]
                cell.configureCell(agendaEvent: myEvent)

             else 
               // the array is empty

            
        
    

【问题讨论】:

您是否告诉核心数据中的日期具有 hh:mm:ss 并且您希望在比较谓词时将其删除? @SandeepBhandari 是的。在核心数据存储也与时间。当我在谓词中使用它来比较它时,我希望日期没有时间 @SandeepBhandari :) 谢谢! 对不起,我帮不上什么忙 好的.. 无论如何感谢您的尝试! :) 【参考方案1】:

不要为此目的使用自定义字符串格式。你想取 与带有日期的 Agendadate 对象相关的所有条目 在给定日期的同一天。

所以你先计算那一天的开始和结束:

let date = Date()

let cal = Calendar.current
let startOfDay = cal.startOfDay(for: date)
let endOfDay = cal.date(byAdding: .day, value: 1, to: startOfDay)!

然后使用这个子查询:

let predicate = NSPredicate(format: "SUBQUERY(agendaDates, $a, $a.dates >= %@ AND $a.dates < %@).@count > 0",
                            startOfDay as NSDate, endOfDay as NSDate)

它为所有人测试$a.dates &gt;= startDate AND $a.dates &lt; endDate 相关对象,如果至少有一个匹配则返回 true 条件。

【讨论】:

感谢您的回答。可能我还没有真正明白。我试图这样做是将所有具有特定议程日期的议程事件附加到一个数组中。所以基本上我选择一个日期。如果日期与议程日期中存在的日期匹配,那么我想将这些议程事件存储在数组中。也许我做错了什么,但如果我添加你的解决方案,它会占用所有的 AgendaEvent。我将编辑我的问题,以便您查看我的代码。谢谢 @Marco:我建议的谓词应该这样做。我注意到在你的代码中,谓词赋值被注释掉了:// fetchRequest.predicate = ...,所以所有反对的都被提取了。 我得到这个可选的(SUBQUERY(agendaDates, $a, $a.dates >= CAST(526860000.000000, "NSDate") AND $a.dates 0) @Marco:这应该获取与(至少)一个日期为 2017 年 9 月 12 日的议程相关的所有对象(假设您在 GMT+2 时区)。跨度> @Marco:我不明白。这里不涉及格式。您说您使用的是核心数据类型“日期”(这很好),因此日期作为数字(自 2001 年 1 月 1 日格林威治标准时间以来的秒数)存储在数据库中,而不是作为字符串。

以上是关于Swift coreData - 格式化日期并在谓词中使用它的主要内容,如果未能解决你的问题,请参考以下文章

swift coredata 查询不适用于今天的日期

在 Swift 中的自定义单元格中存储/检索核心数据

如何在 sqlite 或 CoreData 中保存位置坐标,并在 swift 中进行重要的位置监控

使用 CoreData 以编程方式创建实体/表,并在 Swift 3 for iOS 中将值插入该实体

使用 Swift 从 Core Data 中获取数据并在 UITextFields 中显示

iOS Swift CoreData 异步下载图片数据