2015-04-23 2 views
0

Я работаю над проектом GPS, для этого хочу добавить временные метки (UTC) после каждого получения данных gps. Как я могу конвертировать IST в UTC в C? Я вычитаю 5:30 часов в tv.tv_sec, но это не правильный путь. Есть ли какая-нибудь функция для получения UTC от IST?Как преобразовать время IST в UTC в C (Ubuntu)?

#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, которая напоминает смещение часового пояса вашего местного времени (в соответствии с вашими системными настройками) до GMT, как только был вызван tzset().

0

Если вы хотите разбить временную метку на разбитые поля в формате UTC, а не на любой часовой пояс, который вы используете пользователем, остановите использование localtime() и используйте вместо этого gmtime()!

Вы видите, time_t Временные метки всегда в UTC. gettimeofday(), clock_gettime(CLOCK_REALTIME,) и time() все обеспечивают временные метки в UTC. Сам тип описания говорит, что он описывает количество секунд с момента Epoch в UTC.

Чтобы разбить временные метки на отдельные поля, вы должны использовать gmtime(), если вы хотите детали в UTC, или 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 не влияет, поэтому потеря производительности может быть приемлемой, так как она влияет только на функции локального времени.)

Смежные вопросы