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


当前回答

Nano是10−9,milli是10−3。因此,我们可以使用纳秒的前三个字符来得到毫秒:

date +%s%3N

男人约会:

%N纳秒(000000000..999999999) 1970-01-01 00:00:00 UTC以来的%s秒

来源:服务器故障如何在Bash中以毫秒为单位获得当前Unix时间?

其他回答

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

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

例子:

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

Date +%s返回自epoch以来的秒数,如果有用的话。

我只是想在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'

下面是一个在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一起工作。

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解决方案

自bash 5.0(2019年1月7日发布)以来,您可以使用内置变量EPOCHREALTIME,它包含自epoch以来的秒数,包括小数点后精确到微秒(echo $EPOCHREALTIME输出类似1547624774.371210)。通过移除。最后三个地方是毫秒:

要么使用

(( t = ${EPOCHREALTIME/./} / 1000 ))

或者类似的东西

t=${EPOCHREALTIME/./}  # remove the dot (s → µs)
t=${t%???}             # remove the last three digits (µs → ms)

无论哪种方式t都是1547624774371。