Ios SQLite存储、检索和比较日期时间字段

Ios SQLite存储、检索和比较日期时间字段,ios,objective-c,sqlite,datetime,comparison,Ios,Objective C,Sqlite,Datetime,Comparison,我真的很难在Objective C中比较SQLite查询中的日期。下面是我正在做的: 存储日期: 告诉我使用下面指定的日期格式,但它似乎不正确。我尝试使用yyyy-MM-dd hh:MM:ss,但也没有成功 NSDate *today = [NSDate date]; NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"YYYY-MM-DD HH:MM:SS"]; NS

我真的很难在Objective C中比较SQLite查询中的日期。下面是我正在做的:

存储日期:

告诉我使用下面指定的日期格式,但它似乎不正确。我尝试使用
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文档中所述

    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];
    
    如上所示,您可能还希望指定
    区域设置
    ,以便日期格式不会因设备的本地化设置而改变

  • <>请注意,您可以考虑使用<代码> TimeTimeValue1970 1970版/代码>将日期存储为数据库中的<代码>实际值(而不是<代码>文本< /代码>)。这可以更高效一些,并自动解决UTC问题


    不相关,但我假设您知道,在使用
    stringWithFormat
    构建SQL时应该谨慎。在这种情况下没有问题,但是如果使用任何用户输入,您应该将
    占位符与
    sqlite3\u bind\u text
    一起使用,否则您将面临一系列问题。正确地执行
    sqlite3\u bind\u xxx
    功能可能会很麻烦,但使用它也可以使您在与数据库交互时的生活更加轻松(它也完全解决了与日期相关的问题)。感谢您指出这一点。我一定会检查FMDB。我今天学到了很多:)像你建议的那样使用时间戳进行比较,效果很好。感谢您提供的关于使用日期格式的提示,非常有启发性!