Linux中的唯一时间戳

时间:2016-06-17 23:39:37

标签: linux time

Linux中的时钟是否具有纳秒精度,通过电源循环严格增加和维护?我试图将时间序列数据存储在数据库中,其中每行具有唯一的时间戳。我是否需要使用外部时间源(如GPS接收器)来执行此操作?我希望时间戳可以进入或转换为GPS时间。

这不是How to create a high resolution timer in Linux to measure program performance?的重复。我试图存储绝对时间,而不是计算相对时间差。时钟必须在电源循环中持续存在。

4 个答案:

答案 0 :(得分:1)

现在大多数计算机都有使用互联网定期更正系统时间的软件。这意味着系统时钟可以每隔几毫秒上升或下降。请记住,计算机时钟有一些漂移。如果您不想要闰秒问题,请使用恒星时间(没有闰秒校正)。由于互联网上的延迟不同,ntp将在微秒或毫秒范围内关闭。符合你要求的时钟是五万美元以上。

答案 1 :(得分:1)

没有特别的顺序:

确保您的时间没有节省时间更改使用date的-u参数来使用UTC时间。这总是在增加,从系统管理员处理时间更正。

%N的问题在于您实际获得的精度取决于硬件,并且可能远低于%N允许的精度。运行几个实验来找出答案。对此的警告往往是无处不在,但仍然被忽视。

如果您正在编写Cish代码,请参阅utime()函数并使用gmtime(),而不是localtime()类型函数来转换为文本。查看strftime()函数来格式化整数部分时间。您会发现strftime()格式字段与日期命令格式的字段完全匹配,因为日期调用strftime。愿意编写额外代码的真正偏执狂可以使用CLOCK_MONOTONIC来确保您的时间在增加。

如果你真的需要增加时间,你可能需要编写自己的命令或功能来记住最后一次。如果在同一时间调用,则添加和偏移量为1.根据需要经常递增偏移量,以确保在硬件时间大于调整时间之前的唯一时间。

Linux倾向于支持NTP获取网络时间。前面提到的确保增加时间的功能将有助于向后跳跃,因为跳跃通常不大。

答案 2 :(得分:1)

基于这个问题,其他答案和评论中的讨论...... 通过使用clock_gettime()和使用CLOCK_REALTIME组合CLOCK_MONOTONIC的结果,您可以获得“通过电源循环严格增加并维持的纳秒级精度” - 有一些警告。

首先,关闭NTP。在每次系统重启时运行NTP一次以与世界同步您的时间,但不要在系统启动时更新时间。这样可以避免向后滚动时间。如果不这样做,你可以获得一个序列,如

20160617173556 1001
20160617173556 1009
20160617173556 1013
20160617173555 1020 (notice the second went backward)
20160617173556 1024

(对于这个例子,我只是使用YYMMDDhhmmss后跟一些虚构的单调时钟值。)

然后你面临商业决策。

•与严格增加独特性相比,匹配世界时间有多重要?   。 (硬件时钟漂移可能会随着世界时间而降低准确度)
 •鉴于这一决定,是否值得投资专用硬件,而不是标准(甚至是高端)PC?  •如果在同一纳秒内实际发生两个事件,是否可以有重复的条目?  •等等。

根据导致开发此应用程序的真实要求,可以进行许多权衡。

答案 3 :(得分:0)

如果纳秒级精度对您来说真的足够:     date +%s%N