关于objective c:UNIX TIMESTAMP GMT存储在Integer的sqlite中,转换为本地时区

UNIX TIMESTAMP GMT stored in sqlite in Integer, convert to local time zone

在我的sqlite表中,我已经在gmt时区的时间戳中存储了一个日期,这样:

1
2
3
4
5
CREATE TABLE task (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
date INTEGER,
    name TEXT
);

当我查询数据库时,我想用当地时间检索日期,所以:

1
NSTimeInterval now = [[NSDate date] timeIntervalSince1970];

现在的时间戳是我当地的时区,例如,如果有可能,我想这样做:

1
SELECT id,date,name FROM task WHERE converttolocal(date) = now;

我想知道如果在sqlite中存在一个函数,例如converttolocal自动转换时间戳...

编辑

我找到了这个:

1
strftime('%s',date, 'unixepoch', 'localtime')

但是,例如,如果数据库中的日期gmt是:1375660800,那就是:

1
 GMT: Mon, 05 Aug 2013 00:00:00 GMT

在函数strftime之后,结果是:1375668000,在我当地时间对应:

1
 (CEST) Mine time zone: 05 agosto 2013 04:00:00

但我希望strftime函数的结果给我这个:1375653600即:

1
Mine time zone: 05 agosto 2013 00:00:00 CEST

为什么不给我这个结果?


要从Unix时间戳转换为SQLite的默认日期格式,请使用unixepoch修饰符。
要将时间从UTC转换为本地时间,请使用localtime修饰符。
要从SQLite的默认日期格式转换为Unix时间戳,请使用带%s格式的strftime:

1
SELECT id,date,name FROM task WHERE strftime('%s', date, 'unixepoch', 'localtime') = ?

使用SQLite的内置方法获取当前时间可能更容易,该时间已经是UTC:

1
SELECT id,date,name FROM task WHERE datetime('%s', date, 'unixepoch') = datetime('now')

但是,如果您只有日期,则要忽略时间部分。
在这种情况下,使用date而不是datetime

1
SELECT id,date,name FROM task WHERE date('%s', date, 'unixepoch') = date('now')


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;永远不会成真。