我一直在努力从谷歌书签生成的导出文件中解析出书签。此文件包含以下日期属性:
ADD_DATE="1231721701079000"
ADD_DATE="1227217588219000"
这些不是标准的 Unix 风格的时间戳。有人可以在这里指出我正确的方向吗?如果您真的想帮助我,我将使用 c# 解析它们。
我一直在努力从谷歌书签生成的导出文件中解析出书签。此文件包含以下日期属性:
ADD_DATE="1231721701079000"
ADD_DATE="1227217588219000"
这些不是标准的 Unix 风格的时间戳。有人可以在这里指出我正确的方向吗?如果您真的想帮助我,我将使用 c# 解析它们。
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 模块一样将它们作为字符串处理。
在 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);
}
1231721701079000 看起来很像自 1970 年 1 月 1 日以来的时间,以微秒为单位。
perl -wle 'print scalar gmtime(1231721701079000/1_000_000)'
Mon Jan 12 00:55:01 2009
我会在已知时间做一些书签并尝试确认。
尤里卡!我记得在某个网站上读过 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 宏来将这些转换为可识别的日期,但不是今天!
如果其他人先写了转换脚本,请分享。谢谢。
从最新的 Chrome 版本 73.0.3683.86(官方版本)(64 位)开始:
<a href="https://stackoverflow.com" add_date="1553220774" icon="">Stack Overflow</a>
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)
最初看它,看起来如果你砍掉最后 6 位数字,你会使用在线转换器得到一个合理的 Unix 日期
1231721701 = 2009 年 1 月 12 日星期一 00:55:01 GMT
1227217588 = 2008 年 11 月 20 日星期四 21:46:28 GMT
额外的 6 位数字可能与格式相关或某种扩展属性。
如果确实如此,则有一些用于转换 Unix Timestamps的示例代码。
在此处查找代码示例: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)
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)
#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