关于linux:以毫秒为单位获取时间的命令

Command to get time in milliseconds

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


date +%s%N返回秒数+当前纳秒数。

因此,echo $(($(date +%s%N)/1000000))就是您所需要的。

例如:

1
2
$ echo $(($(date +%s%N)/1000000))
1535546718115

date +%s返回自纪元以来的秒数,如果有用的话


  • date +"%T.%N"以纳秒返回当前时间。

    1
    06:46:41.431857000
  • date +"%T.%6N"返回当前时间,纳秒缩小为前6位,即微秒。

    1
    06:47:07.183172
  • date +"%T.%3N"返回当前时间,纳秒次数舍入为前3位数,即毫秒。

    1
    06:47:42.773

通常,date命令格式的每个字段都可以赋予可选的字段宽度。


纳米是10?9和毫10?3。因此,我们可以使用纳秒的3个第一个字符来获得毫米:

1
date +%s%3N

来自man date

%N nanoseconds (000000000..999999999)

%s seconds since 1970-01-01 00:00:00 UTC

来源:服务器故障我如何使用bash以毫秒为单位获得当前的Unix时间?


在OS X上,date不支持%N标志,我建议使用自制软件安装coreutils。这将使您可以访问名为gdate的命令,该命令在Linux系统上的行为与date相同。

1
brew install coreutils

要获得更"原生"的体验,您可以随时将其添加到.bash_aliases

1
alias date='gdate'

然后执行

1
$ date +%s%N

这是一个以某种方式可移植的hack for linux以毫秒为单位获取时间:

1
2
3
4
5
6
7
#!/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

输出是:

1
3010

这是一个非常便宜的操作,它适用于shell内部和procfs


date命令在OS X上没有提供毫秒,所以使用了python的别名

1
millis(){  python -c"import time; print(int(time.time()*1000))"; }

要么

1
alias millis='python -c"import time; print(int(time.time()*1000))"'


在大多数情况下,其他答案可能就足够了,但我想我在加热箱系统遇到问题时会增加2美分。

有问题的系统不支持%N格式选项,并且没有pythonperl解释器。

经过多次努力,我们(感谢戴夫!)想出了这个:

1
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'

它从adjtimex的输出中提取秒和微秒(通常用于设置系统时钟的选项)并在没有新行的情况下打印它们(因此它们粘在一起)。请注意,微秒字段必须预先填充零,但这不会影响秒数字段,无论如何都要超过6位数。从这一点来说,将微秒转换为毫秒应该是微不足道的。

如果你需要一个尾随的新行(可能是因为它看起来更好),那么试试吧

1
2
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf"
"

另请注意,这需要adjtimexawk。如果没有,那么使用busybox可以在本地指向它们

1
2
ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk

然后将上面称为

1
./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'

或者当然你可以把它们放在你的PATH

编辑:

以上工作在我的busybox设备上。在Ubuntu上我尝试了同样的事情,并意识到adjtimex有不同的版本。在Ubuntu上,这可以输出以秒为单位的时间,以小数点为单位(包括一个尾随的新行)

1
2
sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'

我不会在Ubuntu上这样做。我会用date +%s%N


即使在像AIX这样的异国平台上,也可以使用Perl。例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/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
"
,
    1900+$year, 1+$mon, $mday, $hour, $min, $sec, $msec;

只是想添加@Alper的答案,我必须做些什么才能使这些东西工作:

在Mac上,你需要brew install coreutils所以我们可以使用gdate。否则在Linux上,它只是date。此功能将帮助您定时命令,而无需创建临时文件或任何东西:

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

你可以使用字符串timeit 'tsc --noEmit'


像这样的python脚本:

1
2
import time
cur_time = int(time.time()*1000)