Chrome 的时间戳格式是什么?

问题描述 投票:0回答:7

我正在使用 SQLite 数据库浏览器从包含 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
对它们(返回的行)进行排序?

sqlite google-chrome timestamp
7个回答
74
投票

答案在这个问题中给出:“[Google Chrome 浏览器] 时间戳的格式为自 1601 年 1 月以来的微秒数”

例如,在我的示例历史数据库中,查询

SELECT
  datetime(visit_time / 1000000 + (strftime('%s', '1601-01-01')), 'unixepoch', 'localtime')
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', 'localtime')

结果是:

2013-11-19 18:23:06

16
投票

visits.visit_time
是自 1601 年 1 月 1 日以来的微秒(UTC),这与 Windows 文件时间类似,但不要误认为 Windows 文件时间是自 1601 年 1 月 1 日(UTC)以来的 100 纳秒数。

冷知识:为什么是1601?
我认为流行的答案是因为公历以 400 年为一个周期,而 1601 年是 Windows NT 设计时有效的周期的第一年。换句话说,选择它是为了让数学结果更好。 1601 年 1 月 1 日是 COBOL 整数日期的起源。按照 ANSI 日期格式,这也是第一天。如果您根据 ISO8601 (它所采用的格式)进一步推测,ISO8601 的运行时间可以追溯到 1581 年。在 1583 年之前,时间基于每年 366 天的公历。也许他们只是四舍五入到下一个世纪。


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 EPOCH 格式。


9
投票

Chromes Timestap 不是 Unixepoch!!

Chrome 的基准时间是 01/01/1601 00:00:00。要计算本地时间,Chrome 时间必须除以一百万转换为秒,然后必须减去 01/01/1601 00:00:00 和 01/01/1970 00:00:00 之间的秒差。有两种方法可以做到这一点,即 SQLite 本身和 Unix。

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;

请好好阅读这里


4
投票

这是一个转换 WebKit 时间的紧凑表达式:

sqlite> SELECT datetime(time/1e6-11644473600,'unixepoch','localtime') AS time FROM table;

3
投票

我是编码新手,所以我不确定如何使用 sql 来实现,但是我可以向您展示 c# 中的方法。我希望这会对某人有所帮助。

如果数据库中给出的时间值为:
13029358986442901。仅选择前 11 位数字 13029358986。您可以使用以下方法将其转换为时间:

DateTime dateTimeVar = new DateTime(1601,1,1).AddSeconds(time);

这里的答案是:19-11-2013 18:23:06 这是没有时区转换的情况。


3
投票

您可以减去 11644473600000(1/1/1601 在 unixepoch 中为 -11644473600000)并将其视为常规 unix 纪元时间戳(假设为毫秒)。

米利斯:11644473600000 秒:11644473600


-1
投票

快速提问。历史数据库在 DB Browswer for SQLITE 中打开。浏览数据 > 如何配置包含 start_time 的列以显示格式化时间?

© www.soinside.com 2019 - 2024. All rights reserved.