2015-04-23 123 views
0

我正在开发GPS项目,为此我想在每次接收GPS数据后添加时间戳(UTC)。我如何将IST转换为C中的UTC?我将tv.tv_sec减去5:30小时,但这不是正确的方法。是否有任何功能从IST获取UTC?如何在C(Ubuntu)中将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

您可能想要查看tzset()联机帮助页。它记录了一个全局变量timezone,它类似于当地时间的时区偏移量(根据您的系统设置),一旦调用了tzset(),则为GMT。

0

如果您想将时间戳分成UTC中的分解字段而不是用户当前正在使用的任何时区,请停止使用localtime(),然后改用gmtime()

你看,time_t时间戳总是以UTC。 gettimeofday(),clock_gettime(CLOCK_REALTIME,)time()都提供UTC的时间戳。类型描述本身说明它描述了UTC以来自Epoch以来的秒数。

要将时间戳分解为单独的字段,如果您需要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时间功能不受影响,因此性能损失可能可以接受,因为它只会影响本地时间功能。)