我正在编写一些bash脚本,用于解析和修改OS X中Google Chrome的多个首选项和书签。某些值需要提供17位WebKit时间戳。现在我用13116319200000000
对它进行了硬编码,这对应于本周一在CEST工作日的开始,但是从当前系统时间以某种方式计算它会很棒,因为脚本将在不同的时间部署。
WebKit时间戳是自1月1日1601 00:00 UTC以来的微秒的64位值。在OS X上进行bash转换可能是不可能的,因为内置版本的data
不支持高于一秒的分辨率(如%N
),但也许一些高度智能的数学会做。
无论如何,我搜索了网络并找到了关于如何将这样的时间戳转换为人类可读时间的多个示例,但不是相反。最好的例子是this website,它列出了一些dpcnull用户的python脚本:
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
inTime = int(raw_input('Enter a Webkit timestamp to convert: '))
date_from_webkit(inTime)
并且还在表单的动作上有这个JavaScript(其中document.we.wk.value
指向该表单):
function WebkitToEpoch() {
var wk = document.we.wk.value;
var sec = Math.round(wk / 1000000);
sec -= 11644473600;
var datum = new Date(sec * 1000);
var outputtext = "<b>Epoch/Unix time</b>: " + sec;
outputtext += "<br/><b>GMT</b>: " + datum.toGMTString() + "<br/><b>Your time zone</b>: " + datum.toLocaleString();
$('#resultle1').html(outputtext);
}
看起来它很容易倒置,但我没试过。
有趣的是,该网站显示当前的WebKit时间戳,但经过检查后我相信它是在服务器级别的PHP中计算的,因此无法访问它。
如果有人可以帮助我使用我可以嵌入我的脚本,我会很高兴。
注意:虽然谷歌浏览器使用所有17位精确的微秒,但我并不需要这样的解决方案。就像在链接的网站上一样,最后六位数为零的四舍五入到完全没问题。唯一重要的因素 - 它必须正确计算。
像这样的东西?
from datetime import datetime, timedelta
def date_from_webkit(webkit_timestamp):
epoch_start = datetime(1601, 1, 1)
delta = timedelta(microseconds=int(webkit_timestamp))
return epoch_start + delta
def date_to_webkit(date_string):
epoch_start = datetime(1601, 1, 1)
date_ = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S')
diff = date_ - epoch_start
seconds_in_day = 60 * 60 * 24
return '{:<017d}'.format(
diff.days * seconds_in_day + diff.seconds + diff.microseconds)
# Webkit to date
date_from_webkit('13116508547000000') # 2016-08-24 10:35:47
# Date string to Webkit timestamp
date_to_webkit('2016-08-24 10:35:47') # 13116508547000000
所以在经过Tiger-222提供的很好的解决方案后,我发现了python的datetime
微秒(%f
),并将其添加到我的最终bash脚本中,以获得完整的可用时间分辨率,从而得到精确的WebKit时间戳。可能对某人有帮助,因此最终代码如下:
function currentWebKitTimestamp {
TIMESTAMP="$(python - <<END
from datetime import datetime
def calculateTimestamp():
epoch = datetime(1601, 1, 1)
utcnow = datetime.strptime(datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f'), '%Y-%m-%d %H:%M:%S.%f')
diff = utcnow - epoch
secondsInDay = 60 * 60 * 24
return '{}{:06d}'.format(diff.days * secondsInDay + diff.seconds, diff.microseconds)
print calculateTimestamp()
END)"
echo $TIMESTAMP
}
echo $(currentWebKitTimestamp)
该脚本将bthon嵌入bash中,就像我需要的那样。
重要提示:diff.microseconds
这里没有前导零,因此当低于100k时,它们的添加方式会导致时间戳损坏,因此添加了{:06d}
格式以避免这种情况。