Linux 命令以毫秒为单位获取时间
- 2024-10-31 08:38:00
- admin 原创
- 289
问题描述:
如何在 Bash shell 脚本中获取以毫秒为单位的时间?
解决方案 1:
date +"%T.%N"
以纳秒为单位返回当前时间。
06:46:41.431857000
date +"%T.%6N"
返回当前时间,以纳秒为单位四舍五入到前 6 位数字,即微秒。
06:47:07.183172
date +"%T.%3N"
返回当前时间,以纳秒为单位四舍五入到前 3 位数字,即毫秒。
06:47:42.773
一般来说,date
命令格式的每个字段都可以赋予一个可选的字段宽度。
解决方案 2:
date +%s%N
返回秒数+当前纳秒。
因此,echo $(($(date +%s%N)/1000000))
这就是您所需要的。
例子:
$ echo $(($(date +%s%N)/1000000))
1535546718115
date +%s
如果有用的话,返回自纪元以来的秒数。
解决方案 3:
纳秒是 10 −9,毫秒是 10 −3。因此,我们可以使用纳秒的前三个字符来获取毫秒:
date +%s%3N
从man date
:
%N 纳秒 (000000000..999999999)
自 1970-01-01 00:00:00 UTC 以来已过%s秒
来源:Server Fault如何在 Bash 中获取当前 Unix 时间(以毫秒为单位)?
解决方案 4:
在 OS X 上,date
不支持该%N
标志,我建议coreutils
使用Homebrew安装。这将使你可以访问名为的命令gdate
,其行为与date
Linux 系统上的行为相同。
brew install coreutils
为了获得更“原生”的体验,您可以随时将其添加到您的.bash_aliases
:
alias date='gdate'
然后执行
$ date +%s%N
解决方案 5:
这里有一个适用于 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 一起工作。
解决方案 6:
纯 bash 解决方案
自bash
5.0 版(于 2019 年 1 月 7 日发布)起,您可以使用内置变量EPOCHREALTIME
,其中包含自纪元以来的秒数,包括精确到微秒 (μs) 的小数位(echo $EPOCHREALTIME
打印类似1547624774.371210
英文、1547624774,371210
德文、法文等)。通过删除小数分隔符和最后三位,我们得到毫秒:
要么使用
(( t = ${EPOCHREALTIME/[^0-9]/} / 1000 ))
或者
t=${EPOCHREALTIME/[^0-9]/} # remove the decimal separator (s → µs)
t=${t%???} # remove the last three digits (µs → ms)
无论哪种方式t
都会类似1547624774371
。
解决方案 7:
在大多数情况下,其他答案可能就足够了,但是当我在BusyBox系统上遇到问题时,我想我会提出我的意见。
有问题的系统不支持%N
格式选项,并且没有 Python 或 Perl 解释器。
经过一番思考,我们(感谢 Dave!)得出了以下结论:
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'
它从输出中提取秒和微秒adjtimex
(通常用于设置系统时钟选项)并打印它们而不使用新行(因此它们粘在一起)。请注意,微秒字段必须预先用零填充,但这不会影响秒字段,因为秒字段的长度超过六位数字。由此将微秒转换为毫秒应该很简单。
如果你需要一个尾随的新行(可能是因为它看起来更好)那么尝试
adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "
"
还请注意,这需要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
解决方案 8:
date
命令在 OS X 上没有提供毫秒数,因此使用了 python 的别名
millis(){ python -c "import time; print(int(time.time()*1000))"; }
或者
alias millis='python -c "import time; print(int(time.time()*1000))"'
编辑:遵循@CharlesDuffy 的评论。分叉任何子进程都需要额外的时间。
$ time date +%s%N
1597103627N
date +%s%N 0.00s user 0.00s system 63% cpu 0.006 total
Python 仍在改进其 VM 启动时间,但它不如提前编译的代码(例如date
)那么快。
在我的计算机上,它大约需要 30 毫秒 - 60 毫秒(即 6 毫秒的 5 倍 -10 倍date
)
$ time python -c "import time; print(int(time.time()*1000))"
1597103899460
python -c "import time; print(int(time.time()*1000))" 0.03s user 0.01s system 83% cpu 0.053 total
我认为awk
比更轻python
,因此awk
需要 6ms 到 12ms 的范围(即日期的 1 倍到 2 倍):
$ time awk '@load "time"; BEGIN{print int(1000 * gettimeofday())}'
1597103729525
awk '@load "time"; BEGIN{print int(1000 * gettimeofday())}' 0.00s user 0.00s system 74% cpu 0.010 total
解决方案 9:
显示日期、时间和时区
日期 +"%d-%m-%Y%T.%N%Z"
输出:22-04-2020 18:01:35.970289239 IST
解决方案 10:
我只是想在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:
当您使用 GNU AWK 4.1 版及以上版本时,您可以加载时间库并执行以下操作:
$ 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()
以微秒精度返回时间。
解决方案 12:
即使在 AIX 等奇特平台上,Perl 也可用于此目的。例如:
#!/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
",
1900+$year, 1+$mon, $mday, $hour, $min, $sec, $msec;
解决方案 13:
我想从 bash 生成值并在 Java 代码中使用该值转换回日期(java.util)。
以下命令可以帮助我在 bash 文件中生成值:
date +%s000
解决方案 14:
要打印十进制秒:
start=$(($(date +%s%N)/1000000)) \n && sleep 2 \n && end=$(($(date +%s%N)/1000000)) \n && runtime=$((end - start))
divisor=1000 \n && foo=$(printf "%s.%s" $(( runtime / divisor )) $(( runtime % divisor ))) \n && printf "runtime %s
" $foo # in bash integer cannot cast to float
输出:runtime 2.3
解决方案 15:
如下的 Python 脚本:
import time
cur_time = int(time.time()*1000)
解决方案 16:
对于Alpine,您应该安装coreutils
包以获取date
支持毫秒的 GNU 版本。
date "+%Y.%m.%d %H:%M:%S.%3N"
2024.09.02 16:40:30.984
解决方案 17:
使用简单的 BASH 内部变量 EPOCHREALTIME 怎么样?
解决方案 18:
要获取以毫秒为单位的日期,您可以使用:
date +"%T:%N"
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)