2016-02-23 68 views
3

在我的應用程序中,我將用戶指定的時間轉換爲time_t格式並存儲它。稍後,我會在當地時區顯示這個時間。這裏是我的測試代碼:將時間(用字符串表示)從一個時區轉換爲另一個時區

int main() { 
    const char* INPUTFMT = "%b %d, %Y %H:%M:%S %Z"; 
    const char* SAMPLETIME = "Feb 19, 2016 01:00:00 EST"; 

    struct tm tm = {0}; 
    char* val = strptime(SAMPLETIME, INPUTFMT, &tm); 

    time_t st = mktime(&tm); 

    const struct tm* t1 = localtime(&st); 
    static const char* OUTPUTFMT = "%b %d, %G %I:%M:%S %p %Z"; 
    char buf[100]; 
    strftime (buf, 100, OUTPUTFMT, t1); 

    printf("%s\n", buf); 

    return 0; 
} 

指定的時區是EST,我的本地時區是PST。

我遇到的問題是,雖然我的本地時區不同於指定的時區,但除了EST被PST替換外,我看到了同一時間。

我想知道我做錯了什麼。問候。

+1

@stackptr即使當語義含義是一個常量嗎? – user2864740

+0

很確定所有大寫字母都是c/C++ const命名的標準。 – Tdorno

+0

C沒有符號常量。它不是C++。 'const'限定對象是**語義**靜態變量。改用宏。 – Olaf

回答

3

該名男子頁strptime我的系統(OS X)上說:

的%Z格式說明只接受 本地時區的時區縮寫,或值「GMT」。此限制是由於過度加載時區縮寫導致的 含糊不清。一個 這樣的例子是東部標準時間和東部的東部標準時間 澳大利亞夏令時。

因此該行:

char* val = strptime(SAMPLETIME, INPUTFMT, &tm); 

被悄悄忽略了「EST」的輸入,而是使用當前的本地時間,而不是偏移。因此當你將其轉換回從這裏你當前本地時間:

strftime (buf, 100, OUTPUTFMT, t1); 

,您從當前的本地時間爲UTC的往返和回到你當前本地時間。

看到這個語言無關stack overflow answer欲瞭解更多關於如何處理時區的建議。

相關問題