2011-11-28 113 views
2

問題很簡單,在其他語言中有很多API特定的方法,但我沒有發現這對於跨平臺C++使用來說簡單直接。兩個日期之間的秒差?

如果我有兩個日期,並且它們被假定爲在相同的語言環境中,那麼在C++中區分它們的最簡單方法是什麼?

我有(有點)看着使用time.h,創建兩個tm對象,將它們轉換爲UTC然後區分它們。

的日期目前的格式爲:YY/MM/DD HH:mm:SS(存儲爲單個整數)

編輯:

好了,根據目前的答案,我已經做了以下的(現在):

time_t calculate_seconds_between(
    const uint Y1, const uint M1, const uint D1, const uint H1, const uint m1, const uint S1, // YY/MM/DD HH:mm:SS 
    const uint Y2, const uint M2, const uint D2, const uint H2, const uint m2, const uint S2 
) 
{ 
    time_t raw; 
    time(&raw); 

    struct tm t1 = *gmtime(&raw), t2 = t1; 

    t1.tm_year = Y1 - 1900; 
    t1.tm_mon = M1 - 1; 
    t1.tm_mday = D1; 
    t1.tm_hour = H1; 
    t1.tm_min = m1; 
    t1.tm_sec = S1; 

    t2.tm_year = Y2 - 1900; 
    t2.tm_mon = M2 - 1; 
    t2.tm_mday = D2; 
    t2.tm_hour = H2; 
    t2.tm_min = m2; 
    t2.tm_sec = S2; 

    time_t tt1, tt2; 
    tt1 = mktime(&t1); 
    tt2 = mktime(&t2); 

    return (tt2 - tt1); 
} 

這很好。

+1

請注意,兩次之間的差異不取決於時區,只要它是一致的即可。即17:00:00(UTC + 1)和17:05:00(UTC + 1)之間的差異與16:00:00(UTC)和16:05:00(UTC)之間的差異相同。 (夏令時確實是另一個時區;請注意這一點)。 – MSalters

+0

@ MSalters,是的,我剛剛意識到這一點。有時候只是寫出這個問題給出了產生答案所需的清晰度......這是令人沮喪的,因爲我通常使用SO作爲我的最後手段(即,幾個小時過去)。乾杯:) – dcousens

+0

@Daniel你爲什麼使用gmtime?您需要更新哪些字段? – selalerer

回答

3

YY/MM/DD HH:mm:SS轉換爲struct tm你可以使用strptime(或進行等價的,如果你沒有的話)

const char * dateInput; 
// .... 
struct tm tm; 
time_t val; 

memset(&tm, 0, sizeof(struct tm)); 
strptime(dateInput,"%y/%m/%d %H:%M:%S",&tm); 
val = mktime(&tm); 

之後,你有兩個time_t值,您可以撥打difftime

0

新的C++ 11具有計時庫(也可以從boost,對於非C++ 11個編譯)

有了它,你可以做漂亮的東西像

boost::chrono::system_clock::time_point start = boost::chrono::system_clock::now(); 
// ... 
boost::chrono::duration<double> sec = boost::chrono::system_clock::now() - start; 
std::cout << "took " << sec.count() << " seconds\n"; 

typedef boost::chrono::duration<long, boost::ratio<60> > minutes; 
minutes m1(3);     // m1 stores 3 
minutes m2(2);     // m2 stores 2 
minutes m3 = m1 + m2;   // m3 stores 5