2013-04-10 64 views
0

是否有預先定義的方法將小時和分鐘添加到gmtime通過time.h獲得?我想寫一個程序來顯示各個國家的時間,所以我必須自己編寫邏輯還是有預定義的方法?如何輕鬆地將小時和分鐘添加到gmtime

+0

like [zdump](http://linux.die.net/man/8/zdump)? (例如'zdump US/Eastern') – 2013-04-10 16:08:18

回答

3

沒有執行必要工作的標準化功能。不過,您可以通過修改struct tm來做到這一點。該結構擁有多個成員;一個小時,一個分鐘等。一旦你更新了結構的成員,你應該調用mktime爲了規範化值。

例如,如果分鐘數已經設置爲55,並且您添加十個,則它們將設置爲65.調用mktime將分鐘數設置爲5,並相應地更新小時數和可能的其他成員。

舉個例子添加10分鐘應該是這樣的:

struct tm *t = ... 
t->tm_min += 10; 
mktime(t); 
3

如果你有時間區名稱(如Europe/HelsinkiUS/EasternMST),有一個很簡單的POSIX接口。

它確實適用的時區的全過程,所以如果你使用線程,你需要用你的日期/時間的功能,以避免併發日期/時間訪問,除非他們使用相同的時區,使用例如互斥。這裏顯示的例子不是線程安全的,爲了讓示例更易於理解。

首先,設置環境變量TZ,用冒號前綴時區名稱。這是在POSIX系統中用於爲單個進程設置時區(並影響進程中的所有線程)的方法。例如,

setenv("TZ", ":Europe/Helsinki", 1); 

設置赫爾辛基時區。詳情請參閱man 3 setenv。僅有這一點是不夠的;你還必須告訴C庫更新當前時區,通過調用

tzset(); 

然後,您可以檢查全局變量tzname[0](它應該包含Europe)和tzname[1](它應該包含Helsinki),看看哪個時區竟是組。詳情請參閱man 3 timezone;你可以例如使用POSIX時區定義語法來指定自定義時區。

在上面的兩行之後,無論何時使用localtime()localtime_r(),都會應用所選時區。這很簡單。


如果你也想改變時間戳的格式,以符合特定的區域,可以設置通過

setlocale(LC_TIME, "fi_FI.utf8"); 

注意語言環境(比如,以fi_FI.utf8),作爲man 3 setlocale手冊頁說,區域設置必須是規範格式,像fi這樣的簡短格式將不起作用。然後,使用例如

time_t  now_time; 
struct tm *now_tm; 
char  *format; 
char  buffer[256]; 
size_t  length; 

time(&now_time); 
now_tm = localtime(&now_time); 
if (!now_tm) { 
    /* Error, cannot get local time corresponding to now_time! */ 
    return -1; 
} 

format = nl_langinfo(D_T_FMT); 
if (!format || !*format) { 
    /* Error, cannot get date-time formatting string for this locale */ 
    return -1; 
} 

/* Note: both now_tm and format point to static buffers, 
*  and they will be overwritten by subsequent calls. 
*/ 

length = strftime(buffer, sizeof buffer, format, now_tm); 
if (length < 1 || length >= sizeof buffer) { 
    /* Error in locale configuration; cannot generate date-time string. */ 
    return -1; 
} 

此時buffer包含在芬蘭的日期和時間(或任何語言環境中的最後一個setlocale(LC_TIME, locale)調用設置),在芬蘭時區(或其他時區是在過去setenv("TZ", ":Europe/Helsinki", 1); tzset();調用設置)。 (最後的length檢查是向後兼容一些非常舊的系統,如果緩衝區太小,返回sizeof buffer。較新的系統返回,當緩衝區足夠大,但我期望256字節就足夠了任何語言的時間和日期。)

我想指出這一點,因爲在類POSIX系統中,語言環境(語言和格式)和時區是完全分離的。

相關問題