2016-08-24 8 views
0

Я пишу некоторый скрипт bash, который анализирует и изменяет несколько настроек и закладок Google Chrome в OS X. Некоторые из значений требуют 17-значной метки времени WebKit. На данный момент я жестко закодировал его с 13116319200000000, который соответствует началу моего рабочего дня в этом месяце в CEST, но было бы здорово, если бы это как-то было рассчитано с текущего системного времени, так как сценарий будет развернут в разное время.Преобразование текущего времени в WebKit/Chrome 17-значная временная метка

Временная метка WebKit представляет собой 64-битное значение для микросекунд с 1 января 1601 00:00 по UTC. Такое преобразование в bash на OS X может быть невозможным, так как встроенная версия data не поддерживает разрешение выше второй (например, %N), но может быть, может быть, очень интеллектуальная математика.


Во всяком случае, я искал в Интернет и нашел несколько примеров о том, как преобразовать такую ​​метку времени читаемого времени, но не наоборот. Лучшим примером будет this website, который перечисляет питон скрипт из некоторого dpcnull пользователя:

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 цифр с точными микросекунд, я на самом деле не нужно такое разрешение. Как и на связанном веб-сайте, округление до секунд с шестью цифрами, являющимися нулями, отлично. Единственный важный фактор - он должен правильно рассчитать.

ответ

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

Благодарим вас за то, что вы быстро поняли ответ point_!Пытаясь поместить свой код в мой, я действительно обнаружил, что 'datetime.now()' выводит также точные микросекунды (с '% f'), поэтому я использовал его для получения полного разрешения. К счастью, после нескольких тестов я выяснил, что микросекунды, очевидно, не имеют ведущих нулей, но благодаря сайту [pyformat] (https://pyformat.info) я обнаружил '' {: 06d} '. Format() ' , Я напишу свой последний код здесь. – Soyek

0

Таким образом, после большого решения, предоставленного Tiger-222 я узнал о datetime микросекундах питона (%f) и добавить его в моем последний Баше скрипт, чтобы получить полное доступное разрешение по времени и, в результате, точная 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) 

Сценарий встраивает питона в Баш, так как мне нужно.


Важное примечание:diff.microseconds не имеют ведущих нулей здесь, поэтому, когда ниже 100k, путь они добавили они приведут к искаженной метки времени, поэтому формат {:06d} был добавлен, чтобы избежать этого.

Смежные вопросы