【问题标题】:How to parse Chrome bookmarks "date_added" value to a Date如何将 Chrome 书签“date_added”值解析为日期
【发布时间】:2018-07-14 22:20:43
【问题描述】:

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

{
 "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”应该如何转换为日期或日期字符串?

【问题讨论】:

  • @MarkMeyer——我发现 Python、PHP、C# 等有类似的问题,但 javascript 没有。 :-)

标签: javascript google-chrome date


【解决方案1】:

仅针对需要在 .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()

【讨论】:

    【解决方案2】:

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

    1. 除以 1,000 得到毫秒
    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) 存储为常量 (-11644473600000) 并转换为函数给出:

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

    【讨论】:

    【解决方案3】:

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

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

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

    它也在那里提供它的代码。

    但是代码是在 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()
    

    【讨论】:

    • ⬆ 增加了解释奇异时代起源的细节。
    【解决方案4】:

    我喜欢在电子表格中制​​作这些东西的原型,然后用你碰巧使用的任何语言编写编码公式应该是微不足道的。

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

    解释:

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

    例如,Chrome 的 Bookmark [date_added] 值为“13190650905699900”,所以: “2001-1-1”+ 13190650905699900/24/60/60/1000000 - 400*365.25+3+7/24 产量 12/30/2018 8:41:46pm

    您可以在此处找到书签文件:

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

    截至当前版本的 Chrome (v71)

    PS - Window Time 实用程序也可以为您做到这一点,如果您想要的只是快速的一次性转换:输入

    w32tm.exe /ntte 131906509056999000

    在命令提示符处 - 注意我必须添加一个“0”(或乘以 10)。

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 嗨,欢迎来到堆栈溢出。解释为什么这是问题的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 2011-05-28
      • 2012-05-05
      • 2020-05-27
      相关资源
      最近更新 更多