我一直在努力解析谷歌书签生成的导出文件中的书签。该文件包含以下日期属性:
ADD_DATE = “1231721701079000”
ADD_DATE = “1227217588219000”
这些不是标准的unix样式时间戳。有人能指出我在正确的方向吗?如果你真的想帮我解决的话,我会用c#解析它们。
答案 0 :(得分:15)
Chrome使用Windows时间格式(“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模块一样处理它们。
答案 1 :(得分:6)
1231721701079000自1970年1月1日起以微秒为单位看起来很可疑。
perl -wle 'print scalar gmtime(1231721701079000/1_000_000)'
Mon Jan 12 00:55:01 2009
我会在已知的时间制作一些书签并尝试确认。
答案 2 :(得分:5)
在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);
}
答案 3 :(得分:3)
尤里卡!我记得在某个网站上读过ADD_DATE的意思,但直到今天,我再也找不到了。
http://MSDN.Microsoft.com/en-us/library/aa753582(v=vs.85).aspx
在“出口和进口”标题之前将此解释作为“注释”提供:
“在整个文件[ - ]格式定义中,{date}是一个十进制整数,表示自1970年1月1日午夜以来经过的秒数。”
在此之前,显示了{date}的示例:
< DT>< H3 FOLDED ADD_DATE =“{date}”> {title}< / H3> ...
和
< DT>< A HREF =“{url}”ADD_DATE =“{date}”LAST_VISIT =“{date}”LAST_MODIFIED =“{date}”> {title}< / A> ...
有一天,我会编写一个VBA宏来将这些转换为可识别的日期,但不是今天!
如果其他人先写了转化脚本,请分享。感谢。
答案 4 :(得分:1)
最初看看它,看起来如果你砍下最后6位数字,你就可以使用online converter获得合理的Unix日期
1231721701 =星期一,2009年1月12日00:55:01 GMT
1227217588 =星期四,2008年11月20日21:46:28 GMT
额外的6位数字可能与格式相关或某种扩展属性。
conversion of Unix Timestamps有一些示例代码,如果它实际上是它。
答案 5 :(得分:1)
在这里查看代码示例:http://www.epochconverter.com/#code
//我的groovy(java)代码终于出现了:
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));
//获取纪元日期:
// long epoch = new java.text.SimpleDateFormat(“MM / dd / yyyy HH:mm:ss”)。parse(“01/01/1970 01:00:00”)。getTime()* 1000 ;
return dt;
} // def结束
因此导出为json的firefox书签日期给了我:
json.lastModified:1366313580447014
从纪元日期转换:18 / Apr / 2013 21:33:00
来自:
println“从纪元日期转换:”+ convertDate(json.lastModified)
答案 6 :(得分:0)
从最新的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)
答案 7 :(得分: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)