2015-04-23 96 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時間功能不受影響,因此性能損失可能可以接受,因爲它只會影響本地時間功能。)

相關問題