如何获取微秒分辨率的系统时间

如何获取微秒分辨率的系统时间

我想知道当前系统时间(微秒分辨率)。 date +%s返回自纪元 (1-1-1970) 以来的时间(以秒为单位)。我怎样才能获得以微秒为单位的时间分辨率。查询这个值有多少延迟?我所说的延迟是指假设在t我查询的时间秒,它给我的价值t + t'是什么t'
我的用例:我同时使用多个 Raspberry Pi 录制视频。现在我想为视频的每一帧添加时间戳,以便我可以对齐它们。目前,对于时间戳,它使用启动时间(自启动以来的时间)。启动时间是准确的,但每个 Raspberry Pi 的启动时间都不同。我已将所有 Pi 配置为 NTP 服务器,因此它们都具有相同的系统时间。所以基本上我想要系统时间而不是启动时间的时间戳。我怎样才能做到这一点 ?

答案1

date +%s%N

将给出自纪元以来的纳秒要获取微秒只需执行评估

expr `date +%s%N` / 1000

答案2

date考虑到运行任何命令(甚至命令)都将至少花费数百微秒,因此在 shell 脚本中要求这种精度没有多大意义。

特别是,您无法真正使用该date命令以这种精度来计时命令的执行时间。

为此,最好是使用time命令或关键字。

一些实现允许更改格式以提供过去时间仅具有亚秒级精度。

$ bash -c 'TIMEFORMAT=%3R; time date +%s'
1432210052
0.001

$ ksh -c 'TIMEFORMAT=%3R; time date +%s'
1432210094
0.001

$ zsh -c 'TIMEFMT=%*E; time date +%s'
1432210123
0.001

各种 shell 有各种内置的(因此延迟最小)方法来让您获得时间:

ksh93并且zsh有一个$SECONDS变量,如果将其类型更改为,将为您提供亚秒级精度漂浮:

$ zsh -c 'typeset -F SECONDS=0; date; echo "$SECONDS"'
Thu 21 May 13:09:37 BST 2015
0.0012110000
$ ksh -c 'typeset -F SECONDS=0; date; echo "$SECONDS"'
Thu 21 May 13:09:42 BST 2015
0.0010249615

zsh有一个$EPOCHREALTIME特殊变量(在模块中可用zsh/datetime):

$ zsh -c 'zmodload zsh/datetime; echo $EPOCHREALTIME; date; echo $EPOCHREALTIME'
1432210318.7319943905
Thu 21 May 13:11:58 BST 2015
1432210318.7333047390

ksh93和较新版本的bash支持%(format)Tprintf内置格式,但bash不支持%N(即使这是一个 GNU 扩展),并且他们在如何表达上存在分歧现在

$ ksh -c 'printf "%(%s.%N)T\n" now;printf "%(%s.%N)T\n" now'
1432210726.203840000
1432210726.204068000

(正如您所看到的,两次调用该内置命令之间仍然间隔了 228 微秒)。

答案3

正如您所说,date +%s返回自纪元以来的秒数。所以,

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

date +%s%N值除以 1000 将得到以微秒为单位的值。ie

echo $(($(date +%s%N)/1000))

答案4

我通常用来date +%s%6N获取微秒。下表是每个时间戳的快速备忘单。

时间戳类型 获取时间戳的命令 示例值
秒数 date +%s 1698581801
毫秒 date +%s%3N 1698581813630
微秒 date +%s%6N 1698581885706258
纳秒 date +%s%N 1698581886792509947

相关内容