在我的sqlite表中,我已经在gmt时区的时间戳中存储了一个日期,这样:
CREATE TABLE task (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
date INTEGER,
name TEXT
);
当我查询数据库时,我想用当地时间检索日期:
NSTimeInterval now = [[NSDate date] timeIntervalSince1970];
现在的时间戳是我当地的时区,例如,如果有可能,我想这样做:
SELECT id,date,name FROM task WHERE converttolocal(date) = now;
我想知道是否在sqlite中存在一个函数,例如converttolocal
来自动转换时间戳......
修改
我发现了这个:
strftime('%s',date, 'unixepoch', 'localtime')
但是,例如,如果数据库中的日期gmt为:1375660800
,则为:
GMT: Mon, 05 Aug 2013 00:00:00 GMT
在strftime函数之后,结果是:1375668000
在我当地时间对应:
(CEST) Mine time zone: 05 agosto 2013 04:00:00
但是我希望strftime函数的结果给我这个:1375653600
即:
Mine time zone: 05 agosto 2013 00:00:00 CEST
为什么不给我这个结果?
答案 0 :(得分:1)
SELECT id,date,name FROM task WHERE datetime('date', 'unixepoch', 'localtime') = datetime('now','unixepoch');
这会奏效。但是左侧值永远不会与右侧匹配,您将永远不会检索值,因为您正在捕获时间戳,在您比较时,时间戳值将会发生变化。
所以,SELECT id,date,name FROM task WHERE converttolocal(date) = now;
永远不会成真。
答案 1 :(得分:1)
要从Unix时间戳转换为SQLite的默认日期格式,请使用unixepoch
修饰符。
要将时间从UTC转换为本地时间,请使用localtime
修饰符。
要从SQLite的默认日期格式转换为Unix时间戳,请使用%s
格式的strftime:
SELECT id,date,name FROM task WHERE strftime('%s', date, 'unixepoch', 'localtime') = ?
使用SQLite的内置方法获取当前时间可能更容易,该时间已经是UTC:
SELECT id,date,name FROM task WHERE datetime('%s', date, 'unixepoch') = datetime('now')
但是,如果您只有日期,则要忽略时间部分。
在这种情况下,请使用date
代替datetime
:
SELECT id,date,name FROM task WHERE date('%s', date, 'unixepoch') = date('now')