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

Javascript 将当前时间转换为WebKit/Chrome 17位时间戳,javascript,python,bash,google-chrome,webkit,Javascript,Python,Bash,Google Chrome,Webkit,我正在编写一些bash脚本,用于解析和修改OS X中Google Chrome的多个首选项和书签。其中一些值需要提供17位WebKit时间戳。现在,我已经用13116319200000000对它进行了硬编码,这与我本周一在CEST的工作日的开始相对应,但如果能从当前系统时间以某种方式计算出来,那就太好了,因为脚本将在不同的时间部署 WebKit时间戳是自1601年1月1日00:00 UTC起的64位微秒值。在OS X上的bash中,这种转换可能是不可能的,因为内置版本的数据不支持高于一秒的分辨率

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

WebKit时间戳是自1601年1月1日00:00 UTC起的64位微秒值。在OS X上的bash中,这种转换可能是不可能的,因为内置版本的
数据
不支持高于一秒的分辨率(如
%N
),但可能一些高度智能的数学就可以了


无论如何,我在网上搜索了很多关于如何将时间戳转换成人类可读时间的例子,但不是相反。最好的例子是,列出了来自某个dpcnull用户的python脚本:

表单操作上也有JavaScript(其中
document.we.wk.value
指向该表单):

函数WebkitToEpoch(){
var wk=document.we.wk.value;
var sec=数学整数(周/1000000);
sec-=116444473600;
var数据=新日期(第1000节);
var outputtext=“Epoch/Unix时间:”+秒;
outputtext+=“
GMT:“+datum.togmString()+”
您的时区:“+datum.toLocalString()”; $('#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
从datetime导入datetime,timedelta
来自webkit的定义日期(webkit时间戳):
历元开始=日期时间(1601,1,1)
delta=timedelta(微秒=int(webkit\u时间戳))
返回EPHOU start+delta
def date_to_webkit(日期字符串):
历元开始=日期时间(1601,1,1)
日期=datetime.strTime(日期字符串,%Y-%m-%d%H:%m:%S)
diff=日期\纪元\开始
日内秒=60*60*24

返回“{:因此,在我找到python的
日期时间
微秒(
%f
)并将其添加到我的最终bash脚本中,以获得完全可用的时间分辨率,从而获得精确的WebKit时间戳之后,我发现了python的
日期时间
),并将其添加到我的最终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)
函数currentWebKitTimestamp{
TIMESTAMP=“$(python-非常感谢您给出了闪电般的直截了当的答案!在尝试将您的代码放入我的代码时,我发现
datetime.now()
输出的也是精确的微秒(使用
%f
),所以我用它来获得完整的分辨率。幸运的是,经过几次测试,我发现微秒显然没有前导零,但多亏了站点,我发现了
'{:06d}.format()
。我将在这里发布我的最终代码。
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
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)