我想知道当前系统时间(微秒分辨率)。
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)T
其printf
内置格式,但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 |