我们可以使用内置的printf
函数打印当前时间,而无需调用date
这样的外部命令,如下所示:
printf '%(%Y-%m-%d:%H:%M:%S)T %s\n' -1
# sample output: 2019-03-30:17:39:36,846
我们如何让printf也能打印毫秒或纳秒呢?在格式字符串中使用%3N
或%N
是行不通的:
printf '%(%Y-%m-%d:%H:%M:%S,%3N)T %s\n' -1 # outputs 2019-03-30:17:38:16,%3N
printf '%(%Y-%m-%d:%H:%M:%S,%N)T %s\n' -1 # outputs 2019-03-30:17:38:16,%N
但是,date命令可以正常工作:
date +%Y-%m-%d:%H:%M:%S,%3N # gives 2019-03-30:17:39:36,846
date +%Y-%m-%d:%H:%M:%S,%N # gives 2019-03-30:17:39:36,160643077
这是在Red Hat Linux版本7.3上进行的。
2条答案
按热度按时间7xzttuei1#
第5版和第1m版
EPOCHREALTIME
精度为微秒的浮点值EPOCHSECONDS
自Unix纪元以来的秒数正确的方式
简而言之:
或者,如果您确实不需要存储值:
1.大约
$EPOCHREALTIME
请注意:
如果我在同一行中两次输入同一个变量:
或者更明确地说:
我的乌藨子派也一样
因此,查询这两次构建整数部分和小数部分的分离过程可能会导致以下问题:(在同一行上,第一次访问
$ EPOCHREALTIME
可能会给出:NNN1.999995
,然后下一个:NNN2.000002
。则结果将变为:NNN1.000002
,具有***1000000***微秒误差)2.警告!关于混合
$EPOCHSECONDS
和$EPOCHREALTIME
两者一起使用不仅会导致第一次提到的错误!
$EPOCHSECONDS
使用对time()
的调用,该调用不会不断更新,而$EPOCHREALTIME
使用对gettimeofday()
的调用!因此结果可能会有很大差异:我发现This answer to time() and gettimeofday() return different seconds有很好的解释。
如果我试穿我的主机:
(
注:我使用
read -t
而不是sleep
,因为sleep
不是内置的Nota2:您可以使用函数的参数来更改读取超时(休眠)的值
)
这可能会让事情变得更糟:
其中
$EPOCHREALTIME
的整数部分可能比$EPOCHSECONDS
(在我的主机上)增加超过8000微秒。time()
和gettimeofday()
是错误!3.大约
printf "..%06.0f"
注:我使用
%06.0f
而不是%d
来确保$NSEC
被解释为十进制(浮点),(如果变量以0
开头,则防止八进制解释)。比较:
以及
样品运行:在每秒钟开始时显示时间...
小测试:
您可以通过按任意键结束此测试。
guykilcj2#
在
bash
5中,可以从EPOCHREALTIME
中获取微秒精度,但是printf
本身无法直接获取微秒精度,因此需要自己提取微秒。这需要一点时间,但结果似乎精确到大约0.05毫秒。