在 C 中,如何在 linux 中获得完整的时间戳(甚至在秒之后)?

In C, How to get full timestamp (even after seconds) in linux?

我得到一个字节流,每2000个字节后,我想创建一个新文件并存储它。因为它是连续的字节流,所以我不能使用计数器等。 所以,我想使用系统时间戳来唯一标识文件,如 filename.

我找到了一些线程来获取系统时间戳,但我只能看到几秒钟。有没有其他方法,我们可以在 C 中获得完整的时间戳,linux OS (timestmap like: 2011-11-08 18:02:08.954092000)? 在所有线程中,我只看到秒 2011-11-08 18:02:08

使用 date --rfc-3339='ns' 命令以纳秒精度查看 o/p。您可以尝试查看 "man date" 命令以获取更详细的信息。如您所见,以下是我使用此命令获得的 o/p:

[user1@mach]# date --rfc-3339='ns'
2015-07-29 03:34:09.077024060-07:00

Linux 具有 clock_gettime() 纳秒分辨率。

示例代码

#include <stdio.h>
#include <time.h>

int main(void) {
    unsigned mult = 0;
    struct timespec t0, t1;
    clock_gettime(CLOCK_REALTIME, &t0);
    for (unsigned k = 0; k < 10000000; k++) mult *= k; // no overflow!
    clock_gettime(CLOCK_REALTIME, &t1);

    printf("%lld.%09ld --> %lld.%09ld\n",
          (long long)t0.tv_sec, t0.tv_nsec,
          (long long)t1.tv_sec, t1.tv_nsec);
    return 0;
}

在我的机器上(FreeBSD/Unix 但应该与任何 Linux 相同),上面的代码打印

1438167485.022409606 --> 1438167485.055779608

创建带有毫秒时间戳的文件名字符串的示例代码:

get_time_in_ms.c

#include<stdio.h>
#include<math.h>
#include<stdio.h>
#include<time.h>

void get_time_in_ms()
{
    long ms;
    time_t time;
    struct timespec spec;
    char filename[14];

    clock_gettime(CLOCK_REALTIME, &spec);

    time  = spec.tv_sec;
    ms = round(spec.tv_nsec / 1000000 ); // Convert nanoseconds to milliseconds

    printf("Current time: %lu.%03ld seconds since the Epoch\n", time, ms);
    sprintf(filename,"%lu%03ld",time, ms);
    printf("File name : %s\n", filename);
}

void main() {
        get_time_in_ms();
}

输出:

$ gcc -Wl,--no-as-needed -lrt -lm get_time_in_ms.c -o get_time_in_ms
$ date && get_time_in_ms

Wed Jul 29 16:51:20 IST 2015

Current time: 1438168880.503 seconds since the Epoch

File name : 1438168880503