33

sqlite データベースで日付を操作しようとしています。日付をタイムスタンプとして保存していますが、strftime() を使用して人間が読める日付にフォーマットすると、予期しない結果が返されます。

以下を考慮して、現在のタイムスタンプを選択します。

SELECT strftime("%s","now");
1281353727

次に、今日の日付の人間が読める形式を取得することを期待して、表すことがわかっているタイムスタンプを使用して日付をフォーマットしようとします。

SELECT strftime('%d - %m  - %Y ', 1281353727);
01 - 04  - 3503

代わりに、上記の結果が得られます。これは正しい動作ですか?私は何か間違ったことをしていますか?

前もって感謝します、

ケビン

4

3 に答える 3

66

最初にタイムスタンプを日時に変換する必要があります。

SELECT strftime('%d - %m  - %Y ', datetime(1281353727, 'unixepoch')) FROM Visits;
于 2010-08-09T11:46:16.440 に答える
0

タイムスタンプを日時に変換し、フォーマットします。

SELECT strftime('%d - %m  - %Y ', datetime(1281353727, 'unixepoch', 'localtime')) FROM Visits;

キャッチ1

localtime必ず引数を追加してください。それ以外の場合は、「グリニッジ」に住んでいる人々が認識する日付を取得します (タイムスタンプは 1970 年 1 月 1 日 00:00 UTC (=GMT) にカウントを開始したため)。

EESTタイムゾーンのワークステーションで「localtime」を使用するかどうかに応じて、日付出力がどのように変化するかを以下に示します。

select strftime('%d - %m  - %Y ', datetime(1623707777, 'unixepoch', 'localtime'))

出力: 15 - 06 - 2021

select strftime('%d - %m  - %Y ', datetime(1623707777, 'unixepoch'))

出力: 14 - 06 - 2021

これは、EEST 00:01 の時点で、GMT がまだ昨日のままであるためです。

キャッチ 2

多くのプログラム (ViberPC など) では、ミリ秒 (またはナノ秒) もタイムスタンプに追加されます。この場合、最初に 1000 (またはそれぞれ 1000000) で割る必要があります。

select strftime('%d - %m  - %Y ', datetime(1623707777421/1000, 'unixepoch', 'localtime'))
于 2021-06-14T22:05:27.263 に答える