2016-08-24 497 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}格式已被添加到避免這種情況。