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

时间:2013-05-14 16:42:01

标签: linux bash shell time

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

14 个答案:

答案 0 :(得分:291)

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

因此,您需要echo $(($(date +%s%N)/1000000))

例如:

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

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

答案 1 :(得分:273)

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

    06:46:41.431857000
    
  • date +"%T.%6N"返回当前时间,纳秒次数舍入为前6位,即微秒。

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

    06:47:42.773
    

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

答案 2 :(得分:64)

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

date +%s%3N

来自man date

  

%N 纳秒(000000000..999999999)

     自1970-01-01 00:00:00 UTC

以来

%s

来源:服务器故障的How do I get current Unix time in milliseconds using bash?

答案 3 :(得分:37)

在OS X上, input.gsc-input, .gsc-input-box, .gsc-input-box-hover, .gsc-input-box-focus, .gsc-search-button, .gsc-results-wrapper-visible { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } 不支持date标记,建议您使用homebrew安装%N。这将使您可以访问名为coreutils的命令,该命令在Linux系统上的行为与gdate相同。

date

对于更多"本地人"经验,您可以随时将其添加到brew install coreutils

.bash_aliases

然后执行

alias date='gdate'

答案 4 :(得分:6)

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

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

OR

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

答案 5 :(得分:5)

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

#!/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

答案 6 :(得分:4)

在大多数情况下,其他答案可能已经足够了,但我认为当我在busybox系统上遇到问题时,我会加2美分。

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

经过多次刮擦我们(感谢Dave!)想出了这个:

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

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

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

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

另请注意,这需要adjtimexawk。如果没有,那么使用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

答案 7 :(得分:1)

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;

答案 8 :(得分:1)

从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返回的时间应具有亚秒精度,但实际精度可能会因平台而异。如果标准C gettimeofday()系统调用在此平台上可用,则它仅返回该值。否则,如果在MS-Windows上,它将尝试使用GetSystemTimeAsFileTime()

     

来源:GNU awk manual

在Linux系统上,标准C函数getimeofday()以毫秒为单位返回时间。

答案 9 :(得分:0)

像这样的python脚本:

componentsSeparatedByString

答案 10 :(得分:0)

只是想添加@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'

一起使用

答案 11 :(得分:0)

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

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

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

答案 12 :(得分:0)

纯 bash 解决方案

bash 5.0 (released on 7 Jan 2019) 起,您可以使用内置变量 EPOCHREALTIME,其中包含自纪元以来的秒数,包括小数位到微秒 (μs) 精度(echo $EPOCHREALTIME 打印类似 1547624774.371215 的内容)。通过删除 . 和最后三个位置,我们得到毫秒:

随便用

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

或类似的东西

t=${EPOCHREALTIME/./}
t=${t%???}

无论哪种方式,t 都会类似于 1547624774371

答案 13 :(得分:0)

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

以下命令适用于我在 bash 文件中生成值:

date +%s000