Linux中是否有shell命令以毫秒为单位获取时间?
当前回答
用时间和时区显示日期
日期+"%d-%m-%Y %T "。% N % Z”
输出22
其他回答
Nano是10−9,milli是10−3。因此,我们可以使用纳秒的前三个字符来得到毫秒:
date +%s%3N
男人约会:
%N纳秒(000000000..999999999) 1970-01-01 00:00:00 UTC以来的%s秒
来源:服务器故障如何在Bash中以毫秒为单位获得当前Unix时间?
Perl可以用于此目的,甚至在AIX这样的特殊平台上也是如此。例子:
#!/usr/bin/perl -w
use strict;
use Time::HiRes qw(gettimeofday);
my ($t_sec, $usec) = gettimeofday ();
my $msec= int ($usec/1000);
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime ($t_sec);
printf "%04d-%02d-%02d %02d:%02d:%02d %03d\n",
1900+$year, 1+$mon, $mday, $hour, $min, $sec, $msec;
输出十进制秒数:
start=$(($(date +%s%N)/1000000)) \
&& sleep 2 \
&& end=$(($(date +%s%N)/1000000)) \
&& runtime=$((end - start))
divisor=1000 \
&& foo=$(printf "%s.%s" $(( runtime / divisor )) $(( runtime % divisor ))) \
&& printf "runtime %s\n" $foo # in bash integer cannot cast to float
输出:runtime 2.3
在大多数情况下,其他答案可能已经足够了,但当我在BusyBox系统上遇到问题时,我想补充一下我的意见。
该系统不支持%N格式选项,也没有Python或Perl解释器。
在绞尽脑汁之后,我们(感谢戴夫!)想出了这个:
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
它从adjtimex(通常用于设置系统时钟选项)的输出中提取秒和微秒,并打印它们而不添加新行(因此它们粘在一起)。请注意,microseconds字段必须预先用0填充,但这不会影响seconds字段,因为它长于6位数字。由此,将微秒转换为毫秒应该是很简单的。
如果你需要一个尾随的新行(也许因为它看起来更好),那么试试
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"
还要注意,这需要adjtimex和awk可用。如果没有,那么与BusyBox你可以在本地指向他们:
ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk
然后把上面的称为
./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
当然,你也可以把它们放在你的PATH中
编辑:
以上这些都适用于我的BusyBox设备。在Ubuntu上我尝试了同样的事情,并意识到adjtimex有不同的版本。在Ubuntu上,这可以输出以秒为单位的时间,小数位为微秒(包括后面的新行)
sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'
不过我不会在Ubuntu上这么做。我会使用date +%s%N
下面是一个在Linux上以毫秒为单位获取时间的便携式hack:
#!/bin/sh
read up rest </proc/uptime; t1="${up%.*}${up#*.}"
sleep 3 # your command
read up rest </proc/uptime; t2="${up%.*}${up#*.}"
millisec=$(( 10*(t2-t1) ))
echo $millisec
输出结果为:
3010
这是一个非常廉价的操作,它与shell内部程序和procfs一起工作。