Linux中是否有shell命令以毫秒为单位获取时间?
答案 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
格式选项,并且没有python
或perl
解释器。
经过多次刮擦我们(感谢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"
另请注意,这需要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
答案 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
。 返回的时间应具有亚秒精度,但实际精度可能会因平台而异。如果标准Cgettimeofday()
系统调用在此平台上可用,则它仅返回该值。否则,如果在MS-Windows上,它将尝试使用GetSystemTimeAsFileTime()
。
在Linux系统上,标准C函数getimeofday()
以毫秒为单位返回时间。
答案 9 :(得分:0)
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
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