命令以毫秒为单位获取时间

MOH*_*MED 257 linux bash shell time

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

Alp*_*per 318

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

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

例如:

$ echo $(($(date +%s%N)/1000000))
1535546718115
Run Code Online (Sandbox Code Playgroud)

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

  • `date +%s%3N`更快(基于@ michael-defort的回答) (73认同)
  • 在Mac OS上不起作用,因为`date`不支持`%N` (61认同)
  • 问题是要求Linux命令.@ alper的答案适用于[GNU coreutils]的日期命令(http://www.gnu.org/software/coreutils/).GNUtize您的OSX:[在Mac OS X上安装和使用GNU命令行工具](http://www.topbug.ne​​t/blog/2013/04/14/install-and-use-gnu-command-line-tools-在-MAC-OS-X /) (32认同)
  • 在OSX上,你需要使用MacPorts或Homebrew安装GNU版本的日期作为`coreutils`的一部分 - 然后使用`gdate`命令.看到这个问题:http://stackoverflow.com/questions/9804966/date-command-does-not-follow-linux-specifications-mac-os-x-lion (9认同)
  • 虽然 date +%s%3N 看起来更容易或更好,但是在其他一些偏移计算中使用它会导致时间戳减少 1 毫秒!但这个解决方案与偏移计算完美配合 (2认同)

小智 313

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

  • `%xN`:字段宽度很好! (26认同)
  • 日期 +"%Y%m%d.%H%M%S%3N" 为毫秒。 (6认同)
  • 我想这是一个更好的答案,那个被标记为正确的答案. (3认同)

fed*_*qui 70

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

date +%s%3N
Run Code Online (Sandbox Code Playgroud)

来自man date:

%N 纳秒(000000000..999999999)

自1970-01-01 00:00:00 UTC以来的%s

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


Jos*_*ook 45

在OS X上,date不支持%N标志的地方,我建议coreutils使用自制软件安装.这将使您可以访问所谓的命令,该命令gdatedate在Linux系统上运行.

brew install coreutils
Run Code Online (Sandbox Code Playgroud)

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

alias date='gdate'
Run Code Online (Sandbox Code Playgroud)

然后执行

$ date +%s%N
Run Code Online (Sandbox Code Playgroud)


Soc*_*owi 22

纯bash解决方案

\n

bash5.0(于2019 年 1 月 7 日发布)起,您可以使用内置变量EPOCHREALTIME,其中包含自纪元以来的秒数,包括小数位到微秒 (\xce\xbcs) 精度(echo $EPOCHREALTIME打印类似1547624774.371210英语或1547624774,371210德语的内容、法语等)。通过删除小数点分隔符和最后三位,我们得到毫秒:

\n

要么使用

\n
(( t = ${EPOCHREALTIME/[^0-9]/} / 1000 ))\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
t=${EPOCHREALTIME/[^0-9]/} # remove the decimal separator (s \xe2\x86\x92 \xc2\xb5s)\nt=${t%???}                 # remove the last three digits (\xc2\xb5s \xe2\x86\x92 ms)\n
Run Code Online (Sandbox Code Playgroud)\n

无论哪种方式t都会像1547624774371.

\n


小智 9

这是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
Run Code Online (Sandbox Code Playgroud)

输出为:

3010
Run Code Online (Sandbox Code Playgroud)

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

  • 到目前为止,只有一个在 Xeon Phi BusyBox v1.27.0 (2017-09-27 13:20:28 EDT) MicroOS 上工作的 - 很乐意点赞三遍! (3认同)

Tha*_*wda 7

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

millis(){  python -c "import time; print(int(time.time()*1000))"; }
Run Code Online (Sandbox Code Playgroud)

要么

alias millis='python -c "import time; print(int(time.time()*1000))"'
Run Code Online (Sandbox Code Playgroud)

  • ...但是,一旦您完成了一个单独的进程的fork()处理,便执行了Python解释器,让其加载其库/否则进行初始化,写入其结果并退出,那么该结果将不再准确。 (2认同)

Ani*_*wal 7

显示带有时间和时区的日期

日期 +"%d-%m-%Y %T.%N %Z"

输出 : 22-04-2020 18:01:35.970289239 IST


小智 6

在大多数情况下,其他答案可能就足够了,但我想我会在BusyBox系统上遇到问题时加两分钱。

有问题的系统不支持%N格式选项,也没有 Python 或 Perl 解释器。

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

adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
Run Code Online (Sandbox Code Playgroud)

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

如果您需要尾随新行(可能是因为它看起来更好),请尝试

adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"
Run Code Online (Sandbox Code Playgroud)

另请注意,这需要adjtimex并且awk可用。如果没有,那么使用 BusyBox,您可以使用以下命令在本地指向它们:

ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk
Run Code Online (Sandbox Code Playgroud)

然后将上面的称为

./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
Run Code Online (Sandbox Code Playgroud)

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

编辑:

以上适用于我的 BusyBox 设备。在 Ubuntu 上,我尝试了同样的事情并意识到它adjtimex有不同的版本。在 Ubuntu 上,这可以以秒为单位输出时间,小数位到微秒(包括尾随的新行)

sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'
Run Code Online (Sandbox Code Playgroud)

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