2016-08-24 495 views
0

我正在编写一些bash脚本,用于解析和修改OS X中Google Chrome的多个首选项和书签。某些值需要提供17位WebKit时间戳。现在我已经用13116319200000000对它进行了硬编码,这相当于本周一在CEST开始工作的日子,但是如果按照当前系统时间计算,这将非常棒,因为脚本将在不同的时间部署。将当前时间转换为WebKit/Chrome 17位数时间戳

WebKit时间戳是自1601年1月1日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位精确微秒,我并不真的需要这样的分辨率。就像在链接的网站上,四舍五入到最后六位数字是零是非常好的。唯一重要的因素 - 它必须正确计算。

回答

0

是这样的吗?

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 '{}000000'.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

非常感谢您对__点的快速回复!在试图将你的代码放入我的时候,我实际上已经发现'datetime.now()'输出的精确微秒(带'%f'),所以我用它来获得完整的分辨率。幸运的是,经过几次测试,我发现微秒显然没有前导零,但是感谢[pyformat](https://pyformat.info)网站,我发现了'{:06d}'。 。我会在这里发布我的最终代码。 – Soyek

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) 

脚本嵌入在bash蟒蛇,就像我需要的。


重要提示:diff.microseconds没有前导零这里,所以,当低于10万,他们正在增加,他们会导致损坏的时间戳的方式,因此{:06d}格式已被添加到避免这种情况。