2015-07-02 58 views
0

我想獲取當前時間(UTC + 8),當地時間爲UTC-5。使用mktime計算錯誤的時間以獲取UTC + 8

使用和運行在VS2012如下:

#pragma warning(disable : 4996) 
char buffer[10]; 
time_t rawtime; 
time(&rawtime); 
strftime(buffer, 10, "%H:%M:%S", localtime(&rawtime)); 
cout << "LocalTime=" << buffer << endl; 
strftime(buffer, 10, "%H:%M:%S", gmtime(&rawtime)); 
cout << "GMTime=" << buffer << endl; 
tm* r = gmtime(&rawtime); 
r->tm_hour += 8; // Hong Kong time 
mktime(r); // Normalize the struct 
strftime(buffer, 10, "%H:%M:%S", r); 
cout << "HongKongTime=" << buffer << endl; 

產生以下輸出:

LocalTime=22:51:47 
GMTime=02:51:47 
HongKongTime=11:51:47 

所以它的正確計算UTC,但後來加入8小時,實際上是生產時間是UTC +9。出了什麼問題?

是否有一個更優雅/可靠的方式得到UTC + 8比這個kludge?

+0

的第一件事情,一個出問題是DST(夏令時間)。有一個更好的方法?我很好奇自己看到答案... – marom

+0

是的,夏令時是我的第一個猜測,但它使UTC正確。 – feetwet

回答

1

改變TZ環境變量到你想要的時區後,您可以使用localtime

#include <iostream> 
#include <stdlib.h> 
#include <time.h> 

int main(){ 

    _putenv_s("TZ", "GMT-08:00"); 

    time_t mytime = time(NULL); 
    struct tm* mytm = localtime(&mytime); 

    std::cout << "Current local time and date: " << asctime(mytm); 
    return 0; 
} 

對象mytime將接收的功能time()秒,因爲00:00 hours, Jan 1, 1970 UTC量,這是當前Unix的結果時間戳。 localtime()將使用mytime指向的值填充tm結構,其中值表示對應時間的值,表示爲本地時區。

默認情況下,localtime()使用的時區通常是您的計算機中使用的時區。但是,您可以使用功能_putenv_s()對其進行更改,其中我操作了TZ變量併爲其添加了新定義GMT-08:00,這是香港的時區。

在POSIX系統中,用戶可以通過環境變量TZ 指定時區。

注意,但是操縱TZ變量的更標準的方法是通過使用函數int setenv (const char *name, const char *value, int replace)但它沒有在此示例中定義的,所以我使用的備選。

你可以閱讀更多關於TZ環境變量here

+0

哇,非常優雅!我不太明白爲什麼會這樣,因爲香港在格林威治標準時間8小時之前,但你的代碼確實有效。謝謝! – feetwet