在 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
我得到一个字节流,每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