Chrome的时间戳格式是什么?

Mel*_*lab 28 sqlite timestamp google-chrome

我正在使用SQLite数据库浏览器从包含Google Chrome浏览历史记录的数据库中读取信息.我在"执行SQL"面板中执行的当前代码如下所示:

SELECT last_visit_time,url,title
FROM urls
WHERE url LIKE {PLACEHOLDER} AND title LIKE {PLACEHOLDER}
Run Code Online (Sandbox Code Playgroud)

{PLACEHOLDER}出于隐私目的,"WHERE"行中的内容被阻止.现在,我想让last_visit_time列中返回的数据可读而不是混乱的混乱13029358986442901.我该怎么做?如何将Chrome的时间戳转换为可读格式?如何通过它来订购它们(返回的行)last_visit_time

Ric*_*ish 35

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

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

SELECT
  datetime(visit_time / 1000000 + (strftime('%s', '1601-01-01')), 'unixepoch')
FROM visits
ORDER BY visit_time DESC
LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

给出结果:

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
Run Code Online (Sandbox Code Playgroud)

使用时间戳值13029358986442901:

SELECT
  datetime(13029358986442901 / 1000000 + (strftime('%s', '1601-01-01')), 'unixepoch')
Run Code Online (Sandbox Code Playgroud)

结果是:

2013-11-19 18:23:06
Run Code Online (Sandbox Code Playgroud)

  • SQLite 知道你的时区。你只需要询问它:`datetime(visit_time / 1000000 + (strftime('%s', '1601-01-01')), 'unixepoch', 'localtime')` (3认同)
  • 查询调整为处理时区:`datetime(last_visit_time / 1000000 + (strftime('%s', '1601-01-01T05:30:00')), 'unixepoch')` 其中`T05:30:00` 是我的时区。用你的代替它。 (2认同)

dav*_*rey 9

visits.visit_time 是自1601年1月1日以来的微秒,这是类似的但不能被误认为是Windows文件时间,这是自1601年1月1日以来100纳秒的数量.

琐事:为什么1601?
我认为流行的答案是因为公历运行了400年的周期,1601是在Windows NT设计时活动的第一年.换句话说,它被选择使数学出来很好.1601年1月1日是COBOL整数日期的起源.它也是ANSI日期格式的第1天.如果你根据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格式.

  • [Unix程序员手册第1版将Unix时间定义为"自1971年1月1日00:00:00以来的时间,以六十分之一秒为单位".](http://stackoverflow.com/q/1090869/1922144 ) (3认同)
  • "原来是1971年1月1日"的来源? (2认同)

小智 5

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
Run Code Online (Sandbox Code Playgroud)

日期:

$ date +%s -d 'Jan 1 00:00:00 UTC 1601'
-11644473600
Run Code Online (Sandbox Code Playgroud)

在上面的两个命令中,"%s"表示unixepoch时间.这些命令计算unixepoch时间(1970)和后续日期(Chrome时基,1601)之间的秒数.请注意,秒数为负数.当然,这是因为你必须从1970年到1601年倒数!有了这些信息,我们可以在SQLite中转换Chrome时间,如下所示:

sqlite> SELECT datetime((time/1000000)-11644473600, 'unixepoch', 'localtime') AS time FROM table;
Run Code Online (Sandbox Code Playgroud)

在这里读一读.


归档时间:

查看次数:

22861 次

最近记录:

6 年,7 月 前