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

2024-10-31 08:38:00
admin
原创
289
摘要:问题描述:如何在 Bash shell 脚本中获取以毫秒为单位的时间?解决方案 1:date +"%T.%N"以纳秒为单位返回当前时间。06:46:41.431857000 date +"%T.%6N"返回当前时间,以纳秒为单位四舍五入到...

问题描述:

如何在 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,其行为与dateLinux 系统上的行为相同。

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

bash5.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 "
"

还请注意,这需要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

解决方案 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"
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1124  
  IPD(Integrated Product Development,集成产品开发)流程是一种广泛应用于高科技和制造业的产品开发方法论。它通过跨职能团队的紧密协作,将产品开发周期缩短,同时提高产品质量和市场成功率。在IPD流程中,CDCP(Concept Decision Checkpoint,概念决策检查点)是一个关...
IPD培训课程   79  
  研发IPD(集成产品开发)流程作为一种系统化的产品开发方法,已经在许多行业中得到广泛应用。它不仅能够提升产品开发的效率和质量,还能够通过优化流程和资源分配,显著提高客户满意度。客户满意度是企业长期成功的关键因素之一,而IPD流程通过其独特的结构和机制,能够确保产品从概念到市场交付的每个环节都围绕客户需求展开。本文将深入...
IPD流程   70  
  IPD(Integrated Product Development,集成产品开发)流程是一种以跨职能团队协作为核心的产品开发方法,旨在通过优化资源分配、提高沟通效率以及减少返工,从而缩短项目周期并提升产品质量。随着企业对产品上市速度的要求越来越高,IPD流程的应用价值愈发凸显。通过整合产品开发过程中的各个环节,IPD...
IPD项目管理咨询   82  
  跨部门沟通是企业运营中不可或缺的一环,尤其在复杂的产品开发过程中,不同部门之间的协作效率直接影响项目的成败。集成产品开发(IPD)作为一种系统化的项目管理方法,旨在通过优化流程和增强团队协作来提升产品开发的效率和质量。然而,跨部门沟通的复杂性往往成为IPD实施中的一大挑战。部门之间的目标差异、信息不对称以及沟通渠道不畅...
IPD是什么意思   74  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用