如何在 C 中获得作为 int 的 unix 时间戳?

我想得到当前的时间戳,并打印出使用 fprintf

233602 次浏览

使用第二精度,可以打印从 gettimeofday()函数获得的 timeval结构的 tv_sec字段。例如:

#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
$

对于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_gettimegettimeofday之一(在 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;
}
#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

一个重要的问题是考虑是否基于两个时间戳之间的差异执行任务,因为如果使用 gettimeofday()生成任务,甚至在设置系统时间的同时使用 clock_gettime(CLOCK_REALTIME,..)生成任务,将会得到奇怪的行为。

为了防止这样的问题,改用 clock_gettime(CLOCK_MONOTONIC_RAW, &tms)