2014-10-08 53 views
-1

我試圖在00:00:00這樣的字符串中顯示高分辨率時間點之間的差異。我的問題是,當我打印它時,時間爲+1小時。std chrono用ctime轉換char *時出現1小時錯誤*

#include <chrono> 
#include <ctime> 
#include <iostream> 
#include <thread> 

using namespace std; 
using namespace chrono; 

int main(int argc, char **argv) { 
    auto start = high_resolution_clock::now(); 
    this_thread::sleep_for(seconds(1)); 
    auto stop = high_resolution_clock::now(); 
    auto result = stop - start; 
    time_t t = duration_cast<seconds>(result).count(); 
    cout << ctime(&t) << endl; 
    return EXIT_SUCCESS; 
} 

這將打印

Thu Jan 1 01:00:01 1970 

雖然我希望它打印

Thu Jan 1 00:00:01 1970 

然而,以下的打印1:

cout << (int) duration_cast<seconds>(result).count() << endl; 

也許有事情做與時區?任何幫助表示讚賞!

+0

我在一段時間內沒有使用'ctime',但[文檔](http://en.cppreference.com/w/cpp/chrono/c/ctime)似乎表明時間使用' localtime'。 – 2014-10-08 22:05:00

+0

localtime返回一個struct tm *。我可以編輯時間,但我認爲它應該是正確的,而不是像現在這樣增加1小時。 – fonZ 2014-10-08 22:17:37

+1

如果您不想使用時區,那麼使用不使用時區的函數(可能是'gmtime'或任何其他選項)執行轉換。 – 2014-10-08 22:22:44

回答

1

在你到底是什麼後的意見討論後,我想出了this

size_t MkTimestamp(char *output, size_t size) 
{ 
    milliseconds ms = duration_cast<milliseconds>(system_clock::now().time_since_epoch()); 
    seconds s = duration_cast<seconds>(ms); 
    time_t ctime = (time_t) s.count(); 
    tm components; 
    size_t return_value = 0; 

    if (!localtime_r(&ctime, &components)) return 0; 
    if ((return_value = strftime(output, size, "%F %T:XXX", &components)) == 0) return 0; 

    int ms_d1 = ms.count()/100 % 10, ms_d2 = ms.count()/10 % 10, ms_d3 = ms.count() % 10; 
    output[return_value - 3] = ms_d1 + '0'; 
    output[return_value - 2] = ms_d2 + '0'; 
    output[return_value - 1] = ms_d3 + '0'; 
    return return_value; 
} 

總之,你給它一個字符緩衝區,其大小,並將其寫入一個時間戳(如果緩衝區太小,返回零,否則返回它寫入的字符總數,包括空終止符)。如果你想要這個時間戳爲std::string,您可以使用std::string片構造:

char buffer[64]; 
string timestamp(buffer, MkTimestamp(buffer, sizeof buffer)); 

字符串構造將讀到空終止,如果MkTimestamp成功,如果失敗會產生一個空字符串。如果您願意,您可以將此步驟合併到MkTimestamp中。

這是你的第一次嘗試通過以下方式不同:

  • 既然你想產生一個時間戳,你最好使用絕對,而不是相對的,時間。
  • 由於我們想要使用絕對時間,因此我們必須使用system_clock,因爲這是實際上給出的time_point值的唯一時鐘,可以將舊C族函數接受的值有意義地轉換爲time_t值。 (有時,這兩個時鐘具有相同的時期,或者甚至是相同的時鐘,但並不總是如此)。
  • 我選擇了不同的時間格式。如果你願意,你可以改變它,這不會很難。我強烈建議您保持格式字符串中的毫秒佔位符,所以只要strftime成功,您就不必進行任何長度測試。

信貸,信貸是由於(我在寫這個答案引用的其他計算器答案)

原來的答覆:

Here's an ideone with your code.(公告您描述的問題不會發生你也是。)另外,你錯過了#include <thread>

除此之外,documentation for ctime()表示它的參數預計是日曆日期。你正在傳遞一秒鐘的時間間隔,這本身或多或少沒有意義。您可能是正確的,因爲時區解釋問題,它顯示正好顯示一小時。

如果沒有關於您實際嘗試做什麼的更多細節,我無法更好地回答。

+0

沒有主...你是認真的嗎? – fonZ 2014-10-08 22:13:08

+0

當我開始寫答案時,在編輯之前沒有一個。 – Wug 2014-10-08 22:14:02

+0

我知道...但我認爲閱讀這篇文章的人會明白,這屬於一個主要的程序...所以我加了它。 – fonZ 2014-10-08 22:15:01

相關問題