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

Convert current time to WebKit/Chrome 17-digit timestamp

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

WebKit 时间戳是自 1601 年 1 月 1 日以来微秒的 64 位值 00:00 UTC。 这种转换在 bash 上 OS X 可能是不可能的,因为 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 中计算的,因此无法访问它。

如果有人可以帮助我编写可以嵌入到我的脚本中,我会很高兴。


注意: 虽然Google Chrome使用了所有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

因此,在 提供的出色解决方案之后,我发现了 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} 添加了格式以避免这种情况。