将当前时间转换为WebKit / Chrome 17位数时间戳

时间:2016-08-24 10:13:29

标签: javascript python bash google-chrome webkit

我正在编写一些bash脚本,用于解析和修改OS X中Google Chrome的多个首选项和书签。某些值需要提供17位WebKit时间戳。现在我用13116319200000000对它进行硬编码,这对应于本周一在CEST工作日的开始,但是从当前系统时间以某种方式计算它会很棒,因为脚本将在不同的时间部署。

WebKit时间戳是自1601年1月1日1601 00:00 UTC以来的微秒的64位值。 OS X上的bash中的这种转换可能是不可能的,因为内置版本为{{ 1}}不支持高于一秒的分辨率(如data),但可能会有一些高度智能的数学运算。

无论如何,我搜索过网络并找到了关于如何将这样的时间戳转换为人类可读时间的多个示例,但不是相反。最好的例子是this website,它列出了一些 dpcnull 用户的python脚本:

%N

并且还在表单的操作上有这个JavaScript(其中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) 指向该表单):

document.we.wk.value

看起来很容易被倒置,但我尝试失败了。

有趣的是,该网站显示了当前的WebKit时间戳,但经过检查后我认为它是在服务器级别上用PHP计算的,因此无法访问它。

如果有人可以帮助我制作我可以嵌入我的剧本,我会很高兴。

注意: 尽管Google Chrome使用所有17位精确的微秒,但我并不需要这样的分辨率。就像在链接的网站上一样,最后六位数为零的四舍五入到完全没问题。唯一重要的因素 - 它必须正确计算。

2 个答案:

答案 0 :(得分:2)

这样的东西?

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

答案 1 :(得分:0)

所以在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时,他们添加的方式会导致时间戳损坏,因此{{1添加了格式以避免这种情况。