shell 获取秒、毫秒和纳秒

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

有时候我们在写shell的时候需要获取时间戳(秒、毫秒和纳秒),shell本省不像C++代码那样容易,使用起来也没那么顺畅,但是可以满足我们的需求。


一、date工具

date是linux中的一个工具,可以获取时间和设置时间。用法比较多,我们今天主要讲和时间戳相关的,不讲其它用法。

二、使用步骤

1.获取秒数

代码如下(示例):

date +%s //seconds since 1970-01-01 00:00:00 UTC

意思很明确,是从1970-01-01 00:00:00到现在的所有秒数累加,可以理解为1970-01-01 00:00:00这个时间点是0秒,下一秒就是1,然后就这么一直加下去。

这个值理论上不可能小于0,就算你的计算机恢复出厂设置,时间也不可能比1970还早。

如果你要使用这个命令,请确认你的操作系统时间是正确的。

小提示:Unix时间戳是指从1970年开始到现在的时间,也叫格林威治时间。

2.获取毫秒

代码如下(示例):

seconds=`date +%s`
nano_seconds=`date +%-N`
seconds=$((seconds*1000))//1秒=1000毫秒
nano_seconds=$((nano_seconds/10000000)) 1纳秒=1/1000000 毫秒
milli_seconds=$((seconds+nano_seconds))

注意一个特殊符号%-N,N前面为什么要加一个减号呢?那是因为补全的缘故,如果单独使用+%N,就有可能出现以0开头的纳秒,这个数据是错误的,不能参加数学运算,会报错误。

类似于下面这种:

-bash: 029364404: value too great for base (error token is "029364404")

解决这个问题只需要在N前面加上减号就行了,如果首位是0会被忽略掉,比正常的数据长度少一位,然后转成0毫秒。

3.获取纳秒

这个比较简单:

date +%-N

减号必须带上。还有,注意这个纳秒是一秒内的纳秒,不是总共的纳秒,你需要加上前面获取的秒数,也就是date +%s,这个总和才是现在这个时刻的纳秒。

seconds=`date +%s`
nano_seconds=`date +%-N`
seconds=$((seconds*1000000000))# 1秒=10^9纳秒
nano_seconds=$((seconds+nano_seconds))

4.获取指定的时间戳

前面的方法只能获取当前时刻的时间戳,如果我想获取某一时刻(可能是过去)的时间戳,该怎么办呢?我只需要指定时间字符串就行了,一般精确到秒就行了。
请看下面代码:

date -d "2022-01-01 01:01:01" +%s

-d后面带的字符串就是指定时间的格式,格式不是乱填的,你可以参考我写的,或者参考date文档。

问:上面是获取秒数的,如果我要获取毫秒怎么办呢?
答:其实,只要稍加修改就行了。
请看下面代码:

date -d "2022-01-01 01:01:01" +%s # 得到秒数
date -d "2022-01-01 01:01:01.001" +%-N # 得到纳秒(实际=1毫秒)

通过得到的数据进行简单的加减法就可以得到毫秒了。

当然,得到1微妙和1纳秒也是很简单的。
请看下面代码:

date -d "2022-01-01 01:01:01" +%s # 得到秒数
date -d "2022-01-01 01:01:01.000001" +%-N # 得到纳秒(实际=1微秒)
date -d "2022-01-01 01:01:01.000000001" +%-N # 得到纳秒(实际=1纳秒)

注意,N前面的减号不要漏下了!


总结

1、总体不算太难,所有结果得到的是字符串,可以通过$(())进行数学运算
2、不加-d选项,获取到的时间都是当前的本机时间,如果你的时间错乱,可能影响最终结果;在实际操作前,请确认你的系统时间是对的。
3、可以使用RTC时间同步让你的系统时间保持正确。

猜你喜欢

转载自blog.csdn.net/jiexijihe945/article/details/131231874