生成的 SQLite 数据库中的 NSDate 表示?

NSDate representation in generated SQLite database?

我在 DBAccess 框架中将 NSDate 用于 date/time 表示。但是,当我 运行 SQL 查询时

select date(start) from actions

我得到了一个奇怪的约会对象,而不是我的约会对象。甚至 DBAccess 查询也不起作用,例如:

DBResultSet *today = [[[Actions query] where:@"date(end) = date('now')"] fetch];

在 SQLite 中,列类型是正确的 - 时间戳。那么有什么方法可以正确处理日期/时间吗?

谢谢,

金德里奇

NSDate 存储为 EPOCH,任何 NSDate 对象在作为参数就位时都会进行转换。

因此您的查询将变为:

DBResultSet *today = [[[Actions query] whereWithFormat:@"end = %@", [NSDate date]] fetch];

显然,除非您存储并修剪日期中的秒数以便持久化或检索,否则这将不起作用。

需要变成:

DBResultSet *today = [[[Actions query] whereWithFormat:@"end >= %@ AND end <= %@", beginingOfDay, endOfDay] fetch];

我们可以向 SQLite 添加一个内部函数来帮助更好地支持这些,欢迎提出任何建议。最好只重载现有函数。

如果您想始终存储不带秒精度的 NSDate,您始终可以在 entityWillInsert 方法中添加一些内容并创建 NSDate 的扩展以提供一天的开始,

- (BOOL)entityWillInsert {
  self.end = [self.end dateTrimmedToStartOfDay];
  return YES;
}

这可能是保持所有代码简单的更简单方法。

谢谢 阿德里安

我最终使用 sqlite 函数结束,而不是像@Adrian_H 所建议的那样转换 NSDate。我今天的项目代码如下:

DBResultSet *today = [[[[Actions query] where:@"date(datetime(end, 'unixepoch', 'localtime')) = date('now')"] orderByDescending:@"id"] fetch];

此结果项,最终值为今天。