我想获取当前时间戳并使用fprintf
.
5 回答
对于 32 位系统:
fprintf(stdout, "%u\n", (unsigned)time(NULL));
对于 64 位系统:
fprintf(stdout, "%lu\n", (unsigned long)time(NULL));
只是转换返回的值time()
#include <stdio.h>
#include <time.h>
int main(void) {
printf("Timestamp: %d\n",(int)time(NULL));
return 0;
}
你想要什么?
$ gcc -Wall -Wextra -pedantic -std=c99 tstamp.c && ./a.out
Timestamp: 1343846167
要从纪元开始获得微秒,从 C11 开始,可移植的方法是使用
int timespec_get(struct timespec *ts, int base)
不幸的是,C11 还不是随处可用,所以到目前为止,最接近便携的是使用 POSIX 函数之一clock_gettime
或gettimeofday
(在 POSIX.1-2008 中标记为已过时,建议使用clock_gettime
)。
这两个函数的代码几乎相同:
#include <stdio.h>
#include <time.h>
#include <stdint.h>
#include <inttypes.h>
int main(void) {
struct timespec tms;
/* The C11 way */
/* if (! timespec_get(&tms, TIME_UTC)) { */
/* POSIX.1-2008 way */
if (clock_gettime(CLOCK_REALTIME,&tms)) {
return -1;
}
/* seconds, multiplied with 1 million */
int64_t micros = tms.tv_sec * 1000000;
/* Add full microseconds */
micros += tms.tv_nsec/1000;
/* round up if necessary */
if (tms.tv_nsec % 1000 >= 500) {
++micros;
}
printf("Microseconds: %"PRId64"\n",micros);
return 0;
}
使用第二精度,您可以打印从函数中获得tv_sec
的结构字段。例如:timeval
gettimeofday()
#include <sys/time.h>
#include <stdio.h>
int main()
{
struct timeval tv;
gettimeofday(&tv, NULL);
printf("Seconds since Jan. 1, 1970: %ld\n", tv.tv_sec);
return 0;
}
编译运行示例:
$ gcc -Wall -o test ./test.c
$ ./test
Seconds since Jan. 1, 1970: 1343845834
但是请注意,自纪元以来已经有一段时间了,因此long int
这些天用于适应秒数。
还有一些功能可以打印人类可读的时间。有关详细信息,请参阅此手册页。这是一个使用示例ctime()
:
#include <time.h>
#include <stdio.h>
int main()
{
time_t clk = time(NULL);
printf("%s", ctime(&clk));
return 0;
}
示例运行和输出:
$ gcc -Wall -o test ./test.c
$ ./test
Wed Aug 1 14:43:23 2012
$
#include <stdio.h>
#include <time.h>
int main ()
{
time_t seconds;
seconds = time(NULL);
printf("Seconds since January 1, 1970 = %ld\n", seconds);
return(0);
}
并且会得到类似的结果:
自 1970 年 1 月 1 日以来的秒数 = 1476107865
重要的一点是要考虑是否根据 2 个时间戳之间的差异执行任务,因为如果使用 生成它gettimeofday()
,甚至clock_gettime(CLOCK_REALTIME,..)
在您设置系统时间的那一刻,您会得到奇怪的行为。
为防止此类问题,请clock_gettime(CLOCK_MONOTONIC_RAW, &tms)
改用。