15

我一直在努力从谷歌书签生成的导出文件中解析出书签。此文件包含以下日期属性:

ADD_DATE="1231721701079000"

ADD_DATE="1227217588219000"

这些不是标准的 Unix 风格的时间戳。有人可以在这里指出我正确的方向吗?如果您真的想帮助我,我将使用 c# 解析它们。

4

9 回答 9

19

Chrome 使用 Windows 时间格式的修改形式(“<a href="http://blogs.msdn.com/b/oldnewthing/archive/2009/03/06/9461176.aspx" rel="noreferrer">Windows epoch”) 的时间戳,包括Bookmarks文件和历史文件。Windows 时间格式是自 1601 年 1 月 1 日以来的 100ns-es 数。Chrome 格式是自同一日期以来的微秒数,因此是 1/10。

要将 Chrome 时间戳与 Unix 纪元相互转换,您必须转换为秒并补偿两个基本日期时间 (11644473600) 之间的差异。

以下是 Unix、JavaScript(以毫秒为单位的 Unix)、Windows 和 Chrome 时间戳的转换公式(您可以重新排列 +/× 和 -/÷,但会损失一点精度):

u :  Unix       timestamp    eg: 1378615325
j :  JavaScript timestamp    eg: 1378615325177
c :  Chrome     timestamp    eg: 13902597987770000
w :  Windows    timestamp    eg: 139025979877700000

u =  (j / 1000)
u =  (c - 116444736000000)   / 10000000
u =  (w - 1164447360000000)  / 100000000

j =  (u * 1000)
j =  (c - 116444736000000)   / 10000
j =  (w - 1164447360000000)  / 100000

c =  (u * 10000000)          + 116444736000000
c =  (j * 10000)             + 116444736000000
c =  (w / 10)

w =  (u * 100000000)         + 1164447360000000
w =  (j * 100000)            + 1164447360000000
w =  (c * 10)

请注意,这些数字非常大,因此您需要使用 64 位数字,或者像使用 PHP 的 BC-math 模块一样将它们作为字符串处理。

于 2013-09-08T14:45:46.320 回答
8

在 Javascript 中,代码将如下所示

function chromeDtToDate(st_dt) {
   var microseconds = parseInt(st_dt, 10);
   var millis = microseconds / 1000;
   var past = new Date(1601, 0, 1).getTime();
   return new Date(past + millis);
}
于 2015-11-25T16:35:13.410 回答
7

1231721701079000 看起来很像自 1970 年 1 月 1 日以来的时间,以微秒为单位。

perl -wle 'print scalar gmtime(1231721701079000/1_000_000)'
Mon Jan 12 00:55:01 2009

我会在已知时间做一些书签并尝试确认。

于 2009-02-12T03:40:31.727 回答
3

尤里卡!我记得在某个网站上读过 ADD_DATE 的含义,但直到今天,我再也找不到它了。

http://MSDN.Microsoft.com/en-us/library/aa753582(v=vs.85).aspx

在“出口和进口”标题之前将此解释作为“注释”提供:

“在整个文件[-]格式定义中,{date} 是一个十进制整数,表示自 1970 年 1 月 1 日午夜以来经过的秒数。”</p>

在此之前,展示了 {date} 的示例:

<DT><H3 FOLDED ADD_DATE="{date}">{title}</H3> ...</p>

<DT><A HREF="{url}" ADD_DATE="{date}" LAST_VISIT="{date}" LAST_MODIFIED="{date}">{title}</A> …</p>

有一天,我会编写一个 VBA 宏来将这些转换为可识别的日期,但不是今天!

如果其他人先写了转换脚本,请分享。谢谢。

于 2014-01-10T01:55:36.550 回答
3

从最新的 Chrome 版本 73.0.3683.86(官方版本)(64 位)开始:

  • 当我导出书签时,我得到了一个像“bookmarks_3_22_19.html”这样的 html 文件。
  • 每个项目都有一个包含日期字符串的“add_date”字段。像这样:
<a href="https://stackoverflow.com" add_date="1553220774" icon="">Stack Overflow</a>
  • 这个时间戳实际上是自 1970 年 1 月 1 日以来的(而不是微秒)。所以我们可以使用 Javascript 解析它,如下面的代码:
function ChromeTimeToDate(timestamp) {
   var seconds = parseInt(timestamp, 10);
   var dt = new Date();
   dt.setTime(seconds * 1000);
   return dt;
}
  • 对于上面的示例链接,我们可以调用ChromeTimeToDate('1553220774')获取日期。
ChromeTimeToDate('1553220774')
12:09:03.263 Fri Mar 22 2019 10:12:54 GMT+0800 (Australian Western Standard Time)
于 2019-03-22T04:12:46.943 回答
1

最初看它,看起来如果你砍掉最后 6 位数字,你会使用在线转换器得到一个合理的 Unix 日期

1231721701 = 2009 年 1 月 12 日星期一 00:55:01 GMT

1227217588 = 2008 年 11 月 20 日星期四 21:46:28 GMT

额外的 6 位数字可能与格式相关或某种扩展属性。

如果确实如此,则有一些用于转换 Unix Timestamps的示例代码。

于 2009-02-12T03:38:18.890 回答
1

在此处查找代码示例:http ://www.epochconverter.com/#code

// my groovy (java) code finally came out as:

def convertDate(def epoch)

{

    long dv = epoch / 1000; // divide by 1,000 to avoid milliseconds

    String dt = new java.text.SimpleDateFormat("dd/MMM/yyyy HH:mm:ss").format(new java.util.Date (dv));

   // to get epoch date: 

   //long epoch = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse("01/01/1970 01:00:00").getTime() * 1000;

    return dt;

} // end of def

所以导出为 json 的 Firefox 书签日期给了我:

json.lastModified :1366313580447014

convert from epoch date:18/Apr/2013 21:33:00

从 :

println "convert from epoch date:"+convertDate(json.lastModified)
于 2013-05-01T11:27:42.740 回答
0
function ConvertToDateTime(srcChromeBookmarkDate) {
    //Hp --> The base date which google chrome considers while adding bookmarks
    var baseDate = new Date(1601, 0, 1);

    //Hp --> Total number of seconds in a day.
    var totalSecondsPerDay = 86400;

    //Hp --> Read total number of days and seconds from source chrome bookmark date.
    var quotient = Math.floor(srcChromeBookmarkDate / 1000000);
    var totalNoOfDays = Math.floor(quotient / totalSecondsPerDay);
    var totalNoOfSeconds = quotient % totalSecondsPerDay;

    //Hp --> Add total number of days to base google chrome date.
    var targetDate =  new Date(baseDate.setDate(baseDate.getDate() + totalNoOfDays));

    //Hp --> Add total number of seconds to target date.
    return new Date(targetDate.setSeconds(targetDate.getSeconds() + totalNoOfSeconds));
}

var myDate = ConvertToDateTime(13236951113528894);
var alert(myDate);
//Thu Jun 18 2020 10:51:53 GMT+0100 (Irish Standard Time)
于 2020-06-18T14:40:16.797 回答
0
#Python program

import time

d = 1630352263   #for example put here, if (ADD_DATE="1630352263")

print(time.ctime(d))  #Mon Aug 30 22:37:43 2021 - you will see
于 2021-08-30T21:53:34.647 回答