从 ISO 日期中删除时间以使用 Vapor Swift 进行过滤
Remove time from ISO date to filter with Vapor Swift
我正在研究如何过滤 ISO 日期。我想过滤掉特定日期的待办事项。
日期是这样保存在数据库中的:
"started" -> 2022-03-17 18:46:44+00
我想像这样过滤“开始”
2022-03-17
这是我的查询。我想不出从日期中删除时间的方法。
func indexTodosByDate(req: Request) throws -> EventLoopFuture<[Todo]> {
guard let dateFilter = req.parameters.get("date", as: Date.self) else {
throw Abort(.badRequest)
}
return Todo.query(on: req.db)
.filter(\.$started == dateFilter)
.with(\.$user)
.all()
}
如果您使用的是标准日期格式并且它在迁移中使用 datetime
作为字段类型,则不能。
您需要做的是编写一个查询,搜索日期大于或等于 00:00 且小于或等于 23:59 的日期等。开始计算当天和一天结束并将其传递给您的过滤器。 Swift 的 Calendar
API 具有开始一天的功能
虽然@0xTim 已经确定了正确的方法,但我希望这会为您提供必要的代码来实现您的目标。
首先,扩展 Date 为您提供相关日期的午夜:
extension Date {
var midnight: Date { return Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: self)! }
}
然后,在查询的过滤器中使用它:
let query = ToDo(on: database).filter(\.$started >= dateFilter.midnight)
我正在研究如何过滤 ISO 日期。我想过滤掉特定日期的待办事项。
日期是这样保存在数据库中的:
"started" -> 2022-03-17 18:46:44+00
我想像这样过滤“开始”
2022-03-17
这是我的查询。我想不出从日期中删除时间的方法。
func indexTodosByDate(req: Request) throws -> EventLoopFuture<[Todo]> {
guard let dateFilter = req.parameters.get("date", as: Date.self) else {
throw Abort(.badRequest)
}
return Todo.query(on: req.db)
.filter(\.$started == dateFilter)
.with(\.$user)
.all()
}
如果您使用的是标准日期格式并且它在迁移中使用 datetime
作为字段类型,则不能。
您需要做的是编写一个查询,搜索日期大于或等于 00:00 且小于或等于 23:59 的日期等。开始计算当天和一天结束并将其传递给您的过滤器。 Swift 的 Calendar
API 具有开始一天的功能
虽然@0xTim 已经确定了正确的方法,但我希望这会为您提供必要的代码来实现您的目标。
首先,扩展 Date 为您提供相关日期的午夜:
extension Date {
var midnight: Date { return Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: self)! }
}
然后,在查询的过滤器中使用它:
let query = ToDo(on: database).filter(\.$started >= dateFilter.midnight)