Linux中是否有shell命令以毫秒为单位获取时间?


当前回答

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;

其他回答

我想从bash生成值,并在Java代码中使用该值转换回日期(Java .util)。

以下命令为我在bash文件中生成值:

日期+ % s000

我只是想在Alper的回答中补充一下我必须做的事情:

在Mac上,你需要brew install coreutils,所以我们可以使用gdate。否则在Linux上,它只是日期。这个函数将帮助您执行命令,而无需创建临时文件或任何东西:

function timeit() {
    start=`gdate +%s%N`
    bash -c $1
    end=`gdate +%s%N`
    runtime=$(((end-start)/1000000000.0))
    echo " seconds"
}

你可以将它与字符串一起使用:

timeit 'tsc --noEmit'

在OS X上,date不支持%N标志,我建议使用Homebrew安装coreutils。这将使您能够访问一个名为gdate的命令,其行为与Linux系统上的date相同。

brew install coreutils

为了获得更“原生”的体验,你可以把这个添加到你的.bash_aliases中:

alias date='gdate'

然后执行

$ date +%s%N

在大多数情况下,其他答案可能已经足够了,但当我在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

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;