Linux中是否有shell命令来获取时间(以毫秒为单位)?
date -Ins
Linux中是否有shell命令来获取时间(以毫秒为单位)?
date -Ins
Answers:
date +%s%N
返回秒数+当前纳秒。
因此,echo $(($(date +%s%N)/1000000))
这就是您所需要的。
例:
$ echo $(($(date +%s%N)/1000000))
1535546718115
date +%s
返回自纪元以来的秒数(如果有用)。
%N
不支持date
date +%s%3N
更快(基于@ michael-defort的答案)
coreutils
使用MacPorts或Homebrew的一部分,您需要安装date的GNU版本-然后使用gdate
命令。看到这个问题:stackoverflow.com/questions/9804966/...
date +"%T.%N"
返回当前时间(以纳秒为单位)。
06:46:41.431857000
date +"%T.%6N"
返回当前时间,以纳秒为单位,四舍五入到前6位,即微秒。
06:47:07.183172
date +"%T.%3N"
返回当前时间,以纳秒为单位,四舍五入到前3位,以毫秒为单位。
06:47:42.773
通常,date
可以为命令格式的每个字段指定一个可选的字段宽度。
%xN
:字段宽度不错!
纳米是10 -9和毫10 -3。因此,我们可以使用纳秒的前三个字符来获得毫秒数:
date +%s%3N
来自man date
:
%N 纳秒(000000000..999999999)
自1970-01-01 00:00:00 UTC以来的%s秒
来源:服务器故障的问题如何以Bash来获取当前的Unix时间(以毫秒为单位)?。
在date
不支持该%N
标志的OS X上,建议coreutils
使用Homebrew进行安装。这会给你访问一个名为命令gdate
,将表现为date
确实在Linux系统上。
brew install coreutils
为了获得更“原生”的体验,您可以随时将其添加到您的.bash_aliases
:
alias date='gdate'
然后执行
$ 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。
在大多数情况下,其他答案可能就足够了,但是当我在BusyBox系统上遇到问题时,我想我会加2美分。
有问题的系统不支持%N
format选项,并且没有Python或Perl解释器。
经过大量的抓挠之后,我们(感谢戴夫!)提出了以下建议:
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
它从输出中提取秒和微秒 adjtimex
(通常用于设置系统时钟的选项)并在不使用新行的情况下将它们打印出来(以便将它们粘在一起)。请注意,微秒字段必须预先填充零,但这无论如何都不会影响秒字段,该字段长于六位数。由此,将微秒转换为毫秒应该是微不足道的。
如果您需要结尾的换行符(也许是因为它看起来更好),请尝试
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;
我只是想添加到 Alper的答案中为使此功能正常工作所要做的事情:
在Mac上,您需要brew install coreutils
,因此我们可以使用gdate
。否则,在Linux上,它只是date
。此功能将帮助您计时命令,而无需创建临时文件或其他任何东西:
function timeit() {
start=`gdate +%s%N`
bash -c $1
end=`gdate +%s%N`
runtime=$(((end-start)/1000000000.0))
echo " seconds"
}
您可以将其与字符串一起使用:
timeit 'tsc --noEmit'
function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
从4.1版开始使用GNU AWK时,您可以加载时间库并执行以下操作:
$ awk '@load "time"; BEGIN{printf "%.6f", gettimeofday()}'
这将以秒为单位显示从1970-01-01T00:00:00开始的当前时间(以秒为单位)。
the_time = gettimeofday()
以秒为单位返回自1970-01-01 UTC以来经过的时间(以秒为单位)。如果该平台上没有时间,请返回-1
并设置ERRNO
。返回的时间应具有亚秒精度,但实际精度可能会因平台而异。如果gettimeofday()
在此平台上可以使用标准C 系统调用,则它仅返回该值。否则,如果在MS-Windows上,它将尝试使用GetSystemTimeAsFileTime()
。来源:GNU awk手册
在Linux系统上,标准C函数getimeofday()
以毫秒为单位返回时间。
显示带有时间和时区的日期
日期+“%d-%m-%Y%T.%N%Z”
输出:22-04-2020 18:01:35.970289239 IST
date +%s.%N
会给你十亿分之一秒,你可以用吗?