SQLite Database Browserを使用して、Google Chromeの閲覧履歴を含むデータベースから情報を読み取ります。 「SQL実行」パネルで実行している現在のコードは次のようになります。
SELECT last_visit_time,url,title
FROM urls
WHERE url LIKE {PLACEHOLDER} AND title LIKE {PLACEHOLDER}
「WHERE」行の内容は、プライバシー保護のため{PLACEHOLDER}
でブロックされています。ここで、last_visit_time
のような混乱した混乱の代わりに、13029358986442901
列に返されるデータが読み取り可能になるようにします。これを行う方法と、Chromeのタイムスタンプを読み取り可能な形式に変換する方法を教えてください。 last_visit_time
で(返された行を)並べ替えるにはどうすればよいですか?
答えは この質問 :「[Google Chrome's]タイムスタンプは1601年1月以降のマイクロ秒数としてフォーマットされています」
たとえば、サンプル履歴データベースでは、クエリ
SELECT
datetime(visit_time / 1000000 + (strftime('%s', '1601-01-01')), 'unixepoch')
FROM visits
ORDER BY visit_time DESC
LIMIT 10;
結果を与える:
2014-09-29 14:22:59
2014-09-29 14:21:57
2014-09-29 14:21:53
2014-09-29 14:21:50
2014-09-29 14:21:32
2014-09-29 14:21:31
2014-09-29 14:16:32
2014-09-29 14:16:29
2014-09-29 14:15:05
2014-09-29 14:15:05
13029358986442901のタイムスタンプ値を使用:
SELECT
datetime(13029358986442901 / 1000000 + (strftime('%s', '1601-01-01')), 'unixepoch')
結果は次のとおりです。
2013-11-19 18:23:06
visits.visit_time
は、1601年1月1日UTCからマイクロ秒単位で、同様ですが、1601年1月1日UTCから100ナノ秒のWindowsファイル時間と間違えられません。
雑学:なぜ1601なのか?
グレゴリオ暦は400年のサイクルで動作し、1601はWindows NTの設計時にアクティブだったサイクルの最初の年であるため、一般的な答えだと思います。言い換えれば、数学がうまく出てくるように選ばれました。 1601年1月1日は、COBOL整数日付の起源です。また、ANSI日付形式では1日目です。そして、 ISO8601 (それが含まれている形式)に従ってさらに推測すると、ISO8601は1581年までさかのぼって機能します。 1年当たり。おそらく、彼らは次の世紀に切り上げただけでしょう。
downloads.start_time
は、1970年1月1日UTCからの秒数です
トリビア:なぜ1970年なのか?
まあ、聞いてくれてうれしいです。以前はそうではありませんでした。元々は1971年1月1日でしたが、後に1970年1月1日に丸められました。1970年1月1日はUNIXの誕生。
Firefoxでは、1970年1月1日以降の時間をマイクロ秒数としてフォーマットし、そのフォーマットの名前はPRTime
であることに注意してください
これらはすべて、ISO 8601エポック形式です。
Chromes TimestapはUnixepochではありません!!
Chromeのベースタイムは、1601年1月1日00:00:00です。現地時間を計算するには、Chrome時間を100万で割って秒に変換し、その後、01/01/1601 00:00:00と01/01 /の間の秒差を計算する必要があります1970 00:00:00を差し引く必要があります。これを行うには、SQLite自体とUnixの2つの方法があります。
SQLITE:
sqlite> SELECT strftime('%s', '1601-01-01 00:00:00');
-11644473600
日付:
$ date +%s -d 'Jan 1 00:00:00 UTC 1601'
-11644473600
上記の両方のコマンドで、「%s」はunixepoch時間を表します。コマンドは、unixepoch時間(1970)と後続の日付(Chromeタイムベース、1601)の間の秒数を計算します。秒は負であることに注意してください。もちろん、これは1970年から1601年まで遡ってカウントする必要があるためです!この情報を使用して、SQLiteのChrome時間を次のように変換できます。
sqlite> SELECT datetime((time/1000000)-11644473600, 'unixepoch', 'localtime') AS time FROM table;
よく読んでください こちら 。
私はコーディングが初めてなので、どのようにsqlでそれを行うのかわかりませんが、c#でメソッドを紹介できます。これが誰かを助けることを願っています。
データベースで指定された時間値が次の場合:
13029358986442901。最初の11桁の13029358986のみを選択します。これを使用して、これを時間に変換できます。
DateTime dateTimeVar = new DateTime(1601,1,1).AddSeconds(time);
ここでの答えは:19-11-2013 18:23:06そして、これはあなたのタイムゾーン変換なしでした。
WebKit時間を変換するためのコンパクトな式は次のとおりです。
sqlite> SELECT datetime(time/1e6-11644473600,'unixepoch','localtime') AS time FROM table;
11644473600000(1/1/1601はunixepochでは-11644473600000)を減算し、これをミリ秒を想定しているレギュラーUNIX Epochタイムスタンプとして扱うことができます。
milis:11644473600000秒:11644473600