0

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;

converttolocalたとえば、タイムスタンプを自動的に変換するような関数がsqliteに存在するかどうかを知りたい...

編集

私はこれを見つけました:

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

なぜこの結果が得られないのですか?

4

2 に答える 2

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;決して真実ではありません。

于 2013-08-05T10:34:34.643 に答える
1

Unix タイムスタンプから SQLite のデフォルトの日付形式に変換するには、unixepoch修飾子を使用します。時間を UTC から現地時間に変換するには、localtime修飾子を使用します。SQLite のデフォルトの日付形式から Unix タイムスタンプに変換するには、次の形式でstrftimeを使用します。%s

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')
于 2013-08-05T11:44:33.763 に答える