我正在研究GPS项目,因为我想在每次接收gps数据后添加时间戳(UTC)。如何在C中将IST转换为UTC?我将5:30小时减去tv.tv_sec,但这不是正确的方法。是否有任何函数可以从IST获取UTC?
#define MAX_STRING_SIZE 50 /* for TimeStampsForServer */
int fnTimeStampsForGpsData ()
{
struct timeval tv;
struct tm *ptm;
char TimeString[MAX_STRING_SIZE];
long MicroSeconds;
/**
* Obtain the time of day, and convert it to a tm struct.
*/
gettimeofday (&tv, NULL);
tv.tv_sec -= 19800; /* Number of seconds (5:30) */
ptm = localtime (&tv.tv_sec);
/**
* Format the date and time, down to a single second.
*/
strftime (TimeString, sizeof (TimeString), "%Y-%m-%d %H:%M:%S", ptm);
/**
* Copying microseconds.
*/
MicroSeconds = tv.tv_usec;
/**
* Print the formatted time, in seconds, followed by a decimal point
* and the microseconds.
*/
printf ("%s.%06ld\n", TimeString, MicroSeconds);
return 0;
}
答案 0 :(得分:0)
您可能需要查看tzset()
联机帮助页。它记录了一个全局变量timezone
,它类似于调用tzset()
后当地时间(根据您的系统设置)到GMT的时区偏移量。
答案 1 :(得分:0)
如果您想将时间戳拆分为UTC中的细分字段而不是用户当前使用的任何时区,请停止使用localtime()
,然后改用gmtime()
!
您看,time_t
时间戳始终为UTC。 gettimeofday()
,clock_gettime(CLOCK_REALTIME,)
和time()
都提供UTC时间戳。类型描述本身表示它描述了自UTC时代以来的秒数。
要将时间戳分解为单独的字段,如果您想要UTC中的部分,可以使用gmtime()
;如果希望使用当前时区,则使用localtime()
。
您在示例中清楚地使用了localtime()
。这是你问题的根源。因为你(你在登录的用户在机器上)配置了印度时区 - 这是用户特定的,而不是机器特有 - localtime()
尽职尽责地打破了时间下来,的使用印度标准时间规则。
加尔各答是时区数据库中列出的人口最多的印度城市,因此在C程序中,您可以使用
setenv("TZ", ":Asia/Kolkata", 1);
tzset();
和localtime()
以及其他适用于当地时间的时间函数将使用印度时区。
您也可以仅使用命令行查看其工作原理:
date
TZ=:Asia/Kolkata date
date -u
TZ=:Asia/Kolkata date -u
-u
标志告诉date
使用UTC而不是本地时间输出日期。 (与使用gmtime()
而非localtime()
相同。)
由于设置是整个过程,因此在多线程进程或服务进程中执行起来会有点复杂。服务进程(守护进程)可以使用从属进程进行转换,使用套接字对与arent进行通信(并在套接字关闭时退出,从而在父进程退出时退出)。或者,互斥锁(例如,pthread_mutex_t
互斥锁)可用于保护本地时间函数,因此在任何给定时间最多只有一个线程依赖于该功能。 (UTC时间功能不受影响,因此性能损失可能是可接受的,因为它只影响本地时间功能。)