我真的很难在 Objective C 中比较 SQLite 查询中的日期。这就是我在做什么:

存储日期:

This document 告诉我使用下面指定的日期格式,但这似乎不对。我也尝试使用 yyyy-MM-dd hh:mm:ss 也没有成功。

NSDate *today = [NSDate date];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"YYYY-MM-DD HH:MM:SS"];
NSString *dateString=[dateFormat stringFromDate:today];

NSString *query = [NSString stringWithFormat: @"INSERT INTO user (edited) VALUES (\"%@\")", dateString];

比较日期

我为此使用时间戳,将其转换为日期时间字符串
long stamp = [sessie integerForKey:@"stamp"];

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"YYYY-MM-DD HH:MM:SS"];
NSString *dateString = [formatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:stamp]];

sqlite3_stmt *result = [db selectQuery:[NSString stringWithFormat:@"SELECT * FROM user WHERE edited > '%@'", dateString]];

时间戳只是使用 [[NSDate date] timeIntervalSince1970] 生成的。问题是查询不会给出正确的结果,我什至不知道日期是否存储正确。任何帮助将不胜感激!

最佳答案

几个观察:

  • 对于您的日期字符串,您绝对不想使用 YYYY-MM-DD HH:MM:SS 。这不会生成有效的日期字符串。使用 yyyy-MM-dd hh:mm:ss 更接近,但也不完全正确(因为您将使用 12 小时 hh )。请改用 yyyy-MM-dd HH:mm:ss
  • 但是,这种日期格式不捕获时区,因此,如果将日期字符串存储在 SQLite 数据库中,则应使用 UTC (GMT),如 SQLite Date And Time Functions 文档中所述。
    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    formatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
    NSString *dateString = [formatter stringFromDate:today];
    

    如上所示,您可能还想指定 locale 以便日期格式不会根据设备的本地化设置而改变。
  • 请注意,您可能会考虑使用 timeIntervalSince1970 将日期作为 REAL 值存储在数据库中(而不是 TEXT )。这可能会更有效一点,并自动解决 UTC 问题。
  • 关于ios - SQLite 存储、检索和比较 DATETIME 字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22115571/

    10-16 04:55