Javascript 将当前时间转换为WebKit/Chrome 17位时间戳
我正在编写一些bash脚本,用于解析和修改OS X中Google Chrome的多个首选项和书签。其中一些值需要提供17位WebKit时间戳。现在,我已经用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中,这种转换可能是不可能的,因为内置版本的数据不支持高于一秒的分辨率
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)