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

2024-04-19 20:36:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一些bash脚本来解析和修改osx中googlechrome的多个首选项和书签,其中一些值需要提供17位的WebKit时间戳。现在,我已经用13116319200000000硬编码了它,这与我本周一在CEST工作日的开始相对应,但是如果能以某种方式从当前系统时间开始计算这一点将是非常好的,因为脚本将在不同的时间部署。在

WebKit timestamp是从1601年1月1日00:00 UTC开始的微秒64位值。在OSX上的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)

并且在form的action上还有这个JavaScript(其中document.we.wk.value指向该表单):

^{pr2}$

这看起来很容易倒转,但我尝试失败了。在

有趣的是,这个站点显示了当前的WebKit时间戳,但是经过检查,我相信它是在服务器级别用PHP计算的,因此无法访问它。在

如果有人能帮我把剧本嵌入我的剧本,我会很高兴的。在


注意:虽然googlechrome使用的17位数字都是精确的微秒,但我并不需要这样的分辨率。就像在链接网站上一样,四舍五入到秒,最后六位数为零是非常好的。唯一重要的因素-它必须正确计算。


Tags: from脚本bashdatetimedate时间分辨率start
2条回答

因此,在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)

脚本将python嵌入bash中,正如我需要的那样。在


重要提示:diff.microseconds这里没有前导零,因此当低于100k时,它们的添加方式会导致时间戳损坏,因此添加了{:06d}格式以避免这种情况。在

像这样?在

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

相关问题 更多 >