如何使用bash获取当前的Unix时间(以毫秒为单位)?

我如何获得当前的Unix时间(毫秒)(即从Unix时代1970年1月1日起的毫秒数)?

这个:

date +%s 

将返回自纪元以来的秒数

这个:

 date +%s%N 

返回秒和当前纳秒。

所以:

 date +%s%N | cut -b1-13 

会给你自纪元以来的毫秒数 – 当前秒数加上左三个纳秒。


并从MikeyB – echo $(($(date +%s%N)/1000000)) (除以1000只会带来微秒)

您可以简单地使用%3N将纳秒截断为3个最重要的数字(然后是毫秒):

 $ date +%s%3N 1397392146866 

这工作,例如在我的kubuntu 12.04。

但请注意,根据您的目标系统, %N可能无法执行。 例如,在embedded式系统上testing(buildroot rootfs,使用非HFarm交叉工具链进行编译),没有%N

 $ date +%s%3N 1397392146%3N 

(也是我的(没有根)的Android平板电脑没有%N )。

date +%N在OS X上不起作用,但可以使用其中之一

  • ruby: ruby -e 'puts Time.now.to_f'
  • python: python -c 'import time; print time.time()' python -c 'import time; print time.time()'
  • node.js: node -e 'console.log(Date.now())'
  • PHP: php -r 'echo microtime(TRUE);'
  • 互联网: wget -qO- http://www.timeapi.org/utc/now?\\s.\\N : wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
  • 或毫秒四舍五入到最接近的第二个date +%s000

只是把它扔在那里,但我认为与该部门正确的公式是:

 echo $(($(date +%s%N)/1000000)) 

对于那些build议运行外部程序来获得毫秒级的人 …就是这样做的:

 wget -qO- http://www.timeapi.org/utc/now?\\s.\\N 

要点是:在从这里select任何答案之前,请记住并不是所有的程序都会在一秒钟内运行。 测量!

我的解决scheme不是最好的,但为我工作。

date +%s000

我只需要将date如2012-05-05转换为毫秒。

如果您正在寻找显示脚本运行时间的方法,则以下内容将提供(不完全准确)的结果:

尽可能靠近脚本的开头,input以下内容

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)可以用10亿更换,如果你愿意

"scale=3"是一个非常罕见的设置,强制bc做你想做的事情。 还有更多!

我只在Win7 / MinGW上testing过这个…我没有一个合适的* nix框来处理。

这里是如何得到毫秒的时间,而不进行分工。 也许它更快…

 # test=`date +%s%N` # testnum=${#test} # echo ${test:0:$testnum-6} 1297327781715 

更新:纯粹的bash中的另一种替代scheme只能用于bash 4.2+ ,与上面相同,但使用printf来获取date。 它肯定会更快,因为没有任何进程分叉主要的。

 printf -v test '%(%s%N)T' -1 testnum=${#test} echo ${test:0:$testnum-6} 

这里的另一个问题是,你的strftime实现应该支持%s%N ,而在我的testing机器上则不是这种情况。 请参阅man strftime获取支持的选项。 另请参阅man bash以查看printf语法。 -1-2是时间的特殊值。

使用date和expression式可以让你在那里即

 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模块使用,但完成工作。 时间::格式通常可用于发行版。

 perl -w -e'use Time::Format; printf STDOUT ("%s.%s\n", time, $time{"mmm"})' 

把所有以前的回复放在一起,在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" } 

我们可以得到的最准确的时间戳(至less对于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 $ia=`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