将UTC时间作为time_t

时间:2015-08-16 17:44:03

标签: c

我正在尝试将UTC时间设为time_t。 下面的代码似乎正确,但令人惊讶的是只打印本地时间:

time_t mytime;

struct tm * ptm;

time ( &mytime ); // Get local time in time_t

ptm = gmtime ( &mytime ); // Find out UTC time

time_t utctime = mktime(ptm); // Get UTC time as time_t

printf("\nLocal time %X (%s) and UTC Time %X (%s)", mytime,  ctime(&mytime), utctime, ctime(&utctime));

我们可以看到mytimeutctime的值不同。 但是,当作为参数传递给ctime时,它会将它们转换为相同的字符串。

  

当地时间 55D0CB59 (2015年8月16日星期日23:11:45)和UTC时间 55D07E01   (2015年8月16日星期日23:11:45)

4 个答案:

答案 0 :(得分:3)

ctime结果是一个静态变量。不要在同一个print语句中使用ctime两次。在两个单独的印刷声明中进行。

如果用asctime替换ctime,则会出现同样的问题,因为asctime也会将结果作为静态变量返回。

答案 1 :(得分:2)

这正是documented行为应该做的事情:

  

将计时器指向的值解释为日历时间,并将其转换为包含相应时间和日期的人类可读版本的C字符串,就本地时间而言

您可能希望改为使用asctime

答案 2 :(得分:2)

ctime函数以人类可读的格式返回包含日期和时间信息的C字符串。

要获得UTC时间,您可以使用gettimeofday()(适用于Linux) -

  struct timeval ptm;
  gettimeofday(&ptm,NULL);
  long int ms = ptm.tv_sec * 1000 + ptm.tv_usec / 1000;

你可以在windows中看到函数GetSystemTime

答案 3 :(得分:0)

根据定义,C time()函数以UTC返回time_t纪元时间。因此,注释为“ //在time_t中获取本地时间”的代码确实已经获取了UTC,并且注释不正确。

在Linux手册页中:

  

time_t time(time_t * tloc);
  time()返回的时间是自1970年1月1日00:00:00 +0000( UTC )以来的秒数。

提供代码:

#include <time.h>

...

time_t utc_now = time( NULL );