【问题标题】:Convert current time to WebKit/Chrome 17-digit timestamp将当前时间转换为 WebKit/Chrome 17 位时间戳
【发布时间】:2016-08-24 10:13:29
【问题描述】:

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

WebKit 时间戳是自 1601 年 1 月 1 日 00:00 UTC 以来的 64 位微秒值。 OS X 上的 bash 中的这种转换可能是不可能的,因为 @987654323 的内置版本@ 不支持高于一秒的分辨率(如%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 位数字,但我真的不需要这样的分辨率。就像在链接的网站上一样,四舍五入到秒,最后六位数字为零是完全可以的。唯一重要的因素 - 它必须正确计算。

【问题讨论】:

    标签: javascript python bash google-chrome webkit


    【解决方案1】:

    这样的?

    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
    

    【讨论】:

    • 非常感谢您的闪电般的回答!在尝试将您的代码放入我的代码时,我实际上发现datetime.now() 输出也精确到微秒(%f),所以我用它来获得可用的完整分辨率。幸运的是,经过几次测试后,我发现微秒显然没有前导零,但感谢pyformat 站点,我发现了'{:06d}'.format()。我将在这里发布我的最终代码。
    【解决方案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)
    

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      • 2021-09-29
      • 2018-08-21
      • 1970-01-01
      相关资源
      最近更新 更多