如何将 Chrome 书签"date_added"值解析为日期



Chrome书签文件是JSON,其中包含一个"date_aded"值,表示特定的日期和时间,例如

{
"checksum": "05b8bba8b5f0e9ad1cc8034755557735",
"roots": {
"bookmark_bar": {
"children": [ {
"children": [ {
"date_added": "13170147422089597",
"id": "121",
"name": "NativeScript: Getting Started Guide",
"type": "url",
"url": "https://docs.nativescript.org/tutorial/chapter-0"
} ],
...

我尝试过将该值视为纳秒,并将其传递给Date构造函数:

new Date(13170147422089597 / 1000); // 2387-05-07T06:17:02.089Z

但这似乎并不正确。

应如何将值"13170147422089597"转换为日期或日期字符串?

Chrome书签的时间值是从1601-01-01T00:00:00Z的历元开始的微秒。转换为日期:

  1. 除以1000得到毫秒
  2. 调整到1970-01-01T00:00:00Z的历元
  3. 将结果值传递给Date构造函数

例如

var timeValue = '13170147422089597';
new Date(Date.UTC(1601,0,1) + timeValue / 1000); // 2018-05-07T06:17:02.089Z

将值Date.UTC(1601,0,1(存储为常数(-1164473600000(并转换为函数,得到:

function chromeTimeValueToDate(tv) {
var epoch = -11644473600000;
return new Date(epoch + tv / 1000);
}
// Example
['13170147422089597',
'13150297844686316',
'13115171381595644'].forEach( tv => {
console.log(chromeTimeValueToDate(tv))
});

它是WebKit/Chrome时间戳,表示自1601/1/1 UTC以来的微秒。

它来自Windows NT时间戳(自1601/1/1 UTC以来为100纳秒(,可用作FileTime结构。

中有一个在线WebKit/Chrome时间戳转换器https://www.epochconverter.com/webkit

其也在那里提供其代码。

然而,代码在Python2中,所以我将其转录到Python3中,如下所示:

import datetime
def date_from_webkit(webkit_timestamp):
epoch_start = datetime.datetime(1601,1,1)
delta = datetime.timedelta(microseconds=int(webkit_timestamp))
print(epoch_start + delta) # py3 requires () for print
date_from_webkit(int(input('Enter a Webkit timestamp to convert: '))) # py3 integrates raw_input() and input() into input()

我喜欢在电子表格中对这些东西进行原型设计,然后用你碰巧使用的任何语言编写编码公式都应该很简单。

Formula="2001-1-1"+A2/24/60/1000000-400*365.25+3+7/24

解释:

  • 从Excel(我用作电子表格(可以处理的任意日期开始。。。2001年1月1日
  • 以天(24小时乘60分钟乘60秒乘百万分之一秒(为单位添加书签的数据值[date_added]或[last_visited_datadesk]或[date_modified](在我上面的公式中的单元格A2中(
  • 用天数减去400年(这是400年,包括闰年天数和7小时的时钟调整,因为COBOL开发人员不知何故被困在了1601年,这对他们来说是第一年,所以他们把它作为自己的"纪元"。有趣的是,事情是如何开始的,嗯?(

例如,Chrome的Bookmark[date_added]值为"13190650905699900",因此:"2001-1-1"+13190650905699900/60/100000-400*365.25+3+7/24收益率2018年12月30日下午8:41:46

你可以在这里找到书签文件:

%LOCALAPPDATA%\Google\Chrome\用户数据\默认值\书签

从当前版本的Chrome(v71(开始

PS-窗口时间实用程序也可以为你做,如果你想要的只是一个快速的一次性转换:键入

w32tm.exe/ntte 131906509056999000

在命令提示符下,注意我必须添加一个"0"(或乘以10(。

而且,只是为了节省一些时间。。。(回想起来很明显(。。。书签导出文件采用不同的格式,导出的书签文件中的日期值ADD_date为10个字符,JSON文件中的date_added字段长度为17个字符。

将date_aded除以ADD_date并不能立即给出有用的答案。

对于那些在.NET/PowerShell中需要相同算法的人来说,以下是PowerShell中的实现(.NET版本应该很简单(:

$timeValue = 13268127530603048
$epoch = (New-Object DateTime(1601, 1, 1)).Ticks
$utcTime = New-Object DateTime(($epoch + $timeValue * 10), [System.DateTimeKind]::Utc)
$utcTime.ToLocalTime()