如何在C(Ubuntu)中将IST时间转换为UTC时间?

时间:2015-04-23 09:50:30

标签: c linux ubuntu timezone

我正在研究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;
}

2 个答案:

答案 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时间功能不受影响,因此性能损失可能是可接受的,因为它只影响本地时间功能。)