繁体   English   中英

Swift 核心数据 NSFetchRequest 谓词获取日期时间

[英]Swift core data NSFetchRequest predicate to fetch date time

我有一个名为UVHour的数据库表,其结构如下

紫外线小时

我的应用程序将从如下所示的 JSON 中填充 UVHour 表

[
    {
        "ORDER": 1,
        "DATE_TIME": "SEP/04/2020 04 AM",
        "UV_VALUE": 0
    },
    {
        "ORDER": 2,
        "DATE_TIME": "SEP/04/2020 05 AM",
        "UV_VALUE": 0
    }
]

当前 NSFetchRequest

static var uvIndexNowRequest: NSFetchRequest<UVHour>
    {
        let dateTimeNow = Date()
        let formatter = DateFormatter()
        formatter.dateFormat = "MMM/d/yyyy hh a"
        let dateHourStr = formatter.string(from: dateTimeNow)
        
        let request: NSFetchRequest = UVHour.fetchRequest()
        
        request.sortDescriptors = [NSSortDescriptor(key: "order", ascending: true)]

        // Below code will throw 'NSInvalidArgumentException', reason: 'Unable to parse the format string "date_time == Sep/4/2020 08 PM"
        // request.predicate = NSPredicate(format: "date_time == \(dateHourStr)")
        
        return request
    }

如何编写一个谓词来获取当前日期和时间与当前小时匹配的 UVHour?

例子

假设当前日期是 2020 年 9 月 4 日凌晨 04:10。

基于上面的 JSON,我将获取如下所示的 UVHour

[
    {
        "ORDER": 1,
        "DATE_TIME": "SEP/04/2020 04 AM",
        "UV_VALUE": 0
    }
]

我怎样才能做到这一点?

我能够更新uvIndexNowRequest以找到我的解决方案。 看下面的代码

static var uvIndexNowRequest: NSFetchRequest<UVHour>
    {
        let dateTimeNow = Date()
        
        let formatter = DateFormatter()
        formatter.timeZone = .current
        formatter.dateFormat = "MMM/d/yyyy hh a"
        
        // Find date String from 'formatter.dateFormat'
        let dateHourStr = formatter.string(from: dateTimeNow)
        
        // Get date from dateHourStr
        let someDateTimeOpt = formatter.date(from: dateHourStr)
        
        let request: NSFetchRequest = UVHour.fetchRequest()
        
        request.sortDescriptors = [NSSortDescriptor(key: "order", ascending: true)]
        
        if let someDate = someDateTimeOpt {
            request.predicate = NSPredicate(format: "date_time == %@", someDate as CVarArg)
        }
        
        return request
    }

更短的替代方法是扩展NSDate (!) 来获取小时。 好处是您可以使用计算属性作为键路径。

extension NSDate {
    dynamic var isInCurrentHour : Bool {
        return Calendar.current.isDate(self as Date, equalTo: Date(), toGranularity: .hour)
    }

}


static var uvIndexNowRequest: NSFetchRequest<UVHour>
{
    let request: NSFetchRequest = UVHour.fetchRequest()
    request.sortDescriptors = [NSSortDescriptor(key: "order", ascending: true)]
    request.predicate = NSPredicate(format: "date_time.isInCurrentHour == TRUE")
    
    return request
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM