Answers:
date +%s
将返回自纪元以来的秒数。
date +%s%N
返回秒和当前的纳秒。
date +%s%N | cut -b1-13
将为您提供自纪元以来的毫秒数-当前秒数加上左三分之一的纳秒。
和从MikeyB - echo $(($(date +%s%N)/1000000))
(除以1000只带来微秒)
echo $(($(date +%s%N)/1000))
您可以简单地%3N
将ns截断为3个最高有效数字(然后是毫秒):
$ date +%s%3N
1397392146866
这适用于例如我的kubuntu 12.04。
但是请注意,%N
根据目标系统的不同,可能无法实现。例如,在嵌入式系统(buildroot rootfs,使用非HF臂交叉工具链编译)上进行的测试没有%N
:
$ date +%s%3N
1397392146%3N
(而且我的(非扎根)Android平板电脑也没有%N
)。
1397392146%3N
为1397392146%N
,但输出的1397392146%3N
是我在android平板电脑的busybox控制台上真正看到的内容。您能解释一下您的编辑吗?
date +%s.%3N
版画1510718281.134
。
date +%N
在OS X上不起作用,但是您可以使用以下一种
ruby -e 'puts Time.now.to_f'
python -c 'import time; print time.time()'
node -e 'console.log(Date.now())'
php -r 'echo microtime(TRUE);'
DateTime.utc_now() |> DateTime.to_unix(:millisecond)
wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
date +%s000
node -e 'console.log(Date.now())'
php -r 'echo microtime(TRUE);'
wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
date +%s000
coreutils
对于建议运行外部程序以毫秒为单位的人员……您最好这样做:
wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
要点是:从这里选择任何答案之前,请记住,并非所有程序都会在一秒钟内运行。测量!
date
需要3毫秒才能运行。
此解决方案可在macOS上使用。
如果您考虑使用bash脚本并提供python,则可以使用以下代码:
#!/bin/bash
python -c 'from time import time; print int(round(time() * 1000))'
如果您正在寻找一种显示脚本运行时间的方法,则以下内容将提供(并非完全准确)的结果:
尽可能在脚本开头附近输入以下内容
basetime=$(date +%s%N)
这将为您提供类似于1361802943996000000的起始值
在脚本末尾,使用以下命令
echo "runtime: $(echo "scale=3;($(date +%s%N) - ${basetime})/(1*10^09)" | bc) seconds"
这将显示类似
runtime: 12.383 seconds
笔记:
(1 * 10 ^ 09)可以替换为1000000000
"scale=3"
是一种非常罕见的设置,可以强制bc
执行您想要的操作。还有更多!
我仅在Win7 / MinGW上进行了测试...我没有合适的* nix盒。
time <script>
这是在不执行除法的情况下以毫秒为单位获取时间的方法。也许更快...
# test=`date +%s%N`
# testnum=${#test}
# echo ${test:0:$testnum-6}
1297327781715
更新:纯bash的另一种替代方法仅与bash 4.2+
上面相同,但用于printf
获取日期。肯定会更快,因为没有任何过程可以脱离主要过程。
printf -v test '%(%s%N)T' -1
testnum=${#test}
echo ${test:0:$testnum-6}
但是,这里的另一个问题是您的strftime
实现应该支持%s
,%N
而在我的测试机上却不是这种情况。请参阅man strftime
以获取受支持的选项。另请man bash
参见查看printf
语法。-1
并且-2
是时间的特殊值。
strftime(3)
不支持,%N
所以没有办法printf
打印纳秒。我正在使用Ubuntu 14.04。
date
似乎是更可靠的选择。
我们可以获得的最准确的时间戳(至少对于Mac OS X是这样):
python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")'
1490665305.021699
但是,我们需要记住,运行大约需要30毫秒。我们可以将其削减为2位数的小数位数,并从一开始就计算读取时间的平均开销,然后将其从测量中删除。这是一个例子:
function getTimestamp {
echo `python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")' | cut -b1-13`
}
function getDiff {
echo "$2-$1-$MeasuringCost" | bc
}
prev_a=`getTimestamp`
acc=0
ITERATIONS=30
for i in `seq 1 $ITERATIONS`;do
#echo -n $i
a=`getTimestamp`
#echo -n " $a"
b=`echo "$a-$prev_a" | bc`
prev_a=$a
#echo " diff=$b"
acc=`echo "$acc+$b" | bc`
done
MeasuringCost=`echo "scale=2; $acc/$ITERATIONS" | bc`
echo "average: $MeasuringCost sec"
t1=`getTimestamp`
sleep 2
t2=`getTimestamp`
echo "measured seconds: `getDiff $t1 $t2`"
您可以取消注释echo命令,以更好地了解其工作方式。
此脚本的结果通常是以下3个结果之一:
measured seconds: 1.99
measured seconds: 2.00
measured seconds: 2.01
使用date和expr可以达到目标,即
X=$(expr \`date +%H\` \\* 3600 + \`date +%M\` \\* 60 + \`date +%S\`)
echo $X
只是扩展它就可以做你想做的一切
我意识到自纪元以来并没有给出毫秒数,但是对于某些情况它可能仍然是有用的答案,这完全取决于您真正需要什么,如果需要毫秒数,请乘以1000:D
最简单的方法是制作一个小的可执行文件(来自C f.ex.)并使其可用于脚本。
(从上面重复)date +%N
在OS X上不起作用,但是您也可以使用:
Perl(需要Time :: Format模块)。也许不是最好的CPAN模块,但可以完成工作。Time :: Format通常可用于发行版。
perl -w -e'use Time::Format; printf STDOUT ("%s.%s\n", time, $time{"mmm"})'
date
不能使用,并且没有满足要求的仅bash命令。
date
不能将OSX 用作答案的一部分,我将删除我的反对意见。
在OSX中将所有先前的响应放在一起
ProductName: Mac OS X
ProductVersion: 10.11.6
BuildVersion: 15G31+
你可以喜欢
microtime() {
python -c 'import time; print time.time()'
}
compute() {
local START=$(microtime)
#$1 is command $2 are args
local END=$(microtime)
DIFF=$(echo "$END - $START" | bc)
echo "$1\t$2\t$DIFF"
}