UNIX TIMESTAMP GMT存储在Integer的sqlite中,转换为本地时区

时间:2013-08-05 10:22:35

标签: objective-c sqlite unix-timestamp nstimeinterval

在我的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

为什么不给我这个结果?

2 个答案:

答案 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')